Ich habe einen Manager (Business-Schicht), die ein Repository (Datenzugriffsebene mit EF) aufruft. Die Logik des Managers wird zweimal eine Methode des Repository mit zwei verschiedenen Lambda-Ausdrücken als Parameter aufrufen.Wie verspotten Sie eine Methode zweimal mit unterschiedlichen Lambda-Ausdruck?
Meine Frage ist, wie man mein Repository spotten kann, um eine gegebene Antwort für ein erstes Lambda zurückzugeben, aber eine andere Antwort für ein zweites Lambda zurückzugeben?
Zum Beispiel:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Relation
{
public int GiverId { get; set; }
public int ReceiverId { get; set; }
}
public interface IRelationRepository
{
bool Loves(Expression<Func<Relation, bool>> predicate);
}
public class RelationRepository : IRelationRepository
{
public bool Loves(Expression<Func<Relation, bool>> predicate)
{
// Some logic...
return true;
}
}
public class KissManager
{
private readonly IRelationRepository repository;
public KissManager(IRelationRepository repository)
{
this.repository = repository;
}
public bool Kiss(Person p1, Person p2)
{
var result = this.repository.Loves(r => r.GiverId == p1.Id && r.ReceiverId == p2.Id)
&& this.repository.Loves(r => r.GiverId == p2.Id && r.ReceiverId == p1.Id);
return result;
}
}
[TestMethod]
public void KissWithReceiverNotInLove()
{
// Arange.
var p1 = new Person { Id = 5, Name = "M. Love" };
var p2 = new Person { Id = 17, Name = "Paul Atreid" };
var kissRepositoryMock = new Mock<IRelationRepository>();
kissRepositoryMock
.Setup(m => m.Loves(r => r.GiverId == p1.Id && r.ReceiverId == p2.Id))
.Returns(true);
kissRepositoryMock
.Setup(m => m.Loves(r => r.GiverId == p2.Id && r.ReceiverId == p1.Id))
.Returns(false);
var kissManager = new KissManager(kissRepositoryMock.Object);
// Act.
var result = kissManager.Kiss(p1, p2);
// Assert.
Assert.IsFalse(result);
}
[SetupSequence] (https://codecontracts.info/2011/07/28/moq-setupsequence-is-great-for-mocking/) statt 'Setup'. Stellen Sie jedoch sicher, dass Sie sie in der richtigen Reihenfolge eingerichtet haben. –
Vielen Dank, es funktioniert! Aber wenn ich die Reihenfolge meiner Anrufe (im Manager) ändern, ändert es nichts funktionell, aber mein Test wird fehlgeschlagen. Kennst du einen anderen Weg? – C0b0ll
Die Reihenfolge von SetupSequence muss mit der im SUT übereinstimmen. Wenn Sie die Reihenfolge der Aufrufe in Ihrem SUT ändern, müssen Sie den Test aktualisieren. Die Tests werden in dieser Hinsicht brüchig sein. –