Mocking eine Liste von Objekten
Ich bin, zu lernen, wie zu schreiben unit-tests und bin ein wenig stecken, mit Mocks. Ich bin mit Moq für Spott. Ich bin mit dem eingebauten test-framework, das kommt mit VS 2012. Ich wechseln können, NUnit, wenn das besser ist (und würde mein problem lösen). Ich habe eine unit of work pattern setup. Die Methode, die ich Teste ist für das zurücksetzen des Kennworts eines Benutzers. Ich sage Moq, um eine Liste der Benutzer, basierend auf einem einzigartigen code, das ist, was man in der Methode, die ich Teste:
var mock = new Mock<IUnitOfWork>();
mock.Setup(u => u.UserRepository.Get(t => t.PassResetCode.Equals("test1"), null, "")).Returns(
new List<User>
{
new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "[email protected]", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },
});
In der Methode, die ich Teste, es ruft die folgenden:
var users = unitOfWork.UserRepository.Get(u => u.PassResetCode.Equals(code));
Soweit ich das beurteilen kann, ist es nicht zurückgeben der Liste der Benutzer ich erstellen in dem test hier. Ich müssen zu verspotten, das repository zu, das innerhalb der Arbeitseinheit Klasse? Oder ist einfach nur lustig das unit of work Schnittstelle genug? Kann ich nach mehr von dem code, wenn das hilft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Repository akzeptiert delegieren und Sie sind Einstellung, eine Erwartung, zu erwarten, dass insbesondere die Delegierten
t => t.PassResetCode.Equals("test1")
. Ich glaube, mock-innen vergleichen Sie die bestanden-Prädikat an diese delegieren. Verschiedene Delegat-Instanzen nicht übereinstimmen mit 99,99% Wahrscheinlichkeit. Sie sollten wahrscheinlich vermeiden, die Einrichtung von spezifischen Einschränkung für Prädikat in dieser bestimmten Erwartung und NutzungIt.IsAny<>()
statt.It.IsAny<>()
in diesem Fall. Die Eingabe, was Sie haben, scheint es nicht zu kompilieren. Können Sie fügen Sie einige mehr zum Beispiel oder brauchst du noch mehr von meinem code zu tun? Ich Schätze die Hilfe!It.IsAny<T>
T werden sollten, die Art Ihrer Stellvertretung ein, die Sie übergeben, umGet
Methode.Argument 1: cannot convert from 'System.Func<RunnersTrackerDB.User,bool>' to 'System.Linq.Expressions.Expression<System.Func<RunnersTrackerDB.User,bool>>
Die Signatur der Methode für die Get-Methode ist:public virtual IEnumerable<TEntity> Get( Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "")
Expression
dort. Also die Letzte version, die für mich gearbeitet war in diesem Fall:mock.Setup(u => u.UserRepository.Get(It.IsAny<Expression<Func<User, bool>>>(), null, "")).Returns(...)
Danke für die Hilfe!Müssen Sie sicher sein, dass Sie auf der Durchreise sind genau diese Parameter. Oder Sie können verwenden Sie die syntax
It.IsAny<TYPE>()
für alle parameter, die Sie nicht interessieren. Oder Sie tun könnenIt.Is<TYPE>(condition)
zu prüfen, für die parameter.Vorausgesetzt, Sie verwenden Moq, das Problem ist die setup-Methode nicht handhaben lambdas so. Du brauchst
It.IsAny<Func<T, bool>> ()
als Ihr erstes argument.