I have a problem when I try to make this test successful (passing):
public void FindeParkausweisByKennzeichen_kennzeichen_ReturnsAusweis()
{
//Arrange
var dbContextMockHelper = new DbContextMockHelper();
PasovContext dbContextMock = dbContextMockHelper.GenerateDbContextMock();
List<Ausweis> liste = dbContextMockHelper.GenerateDbSetAusweise();
dbContextMock.Ausweise = dbContextMockHelper.GetQueryableMockDbSet(liste);
var klasse = new AusweisRepository(dbContextMock);
var parameter = "k-fz 4711";
//Act
var result = klasse.FindeParkausweisByKennzeichen(parameter);
//Assert
Assert.That(result, Is.TypeOf<Ausweis>());
}
The DbSet
is mocked using this method (of the DbContextMockHelper
class):
public DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
dbSet.Setup(m => m.Add(It.IsAny<T>())).Callback<T>((s) => sourceList.Add(s));
dbSet.Setup(m => m.Remove(It.IsAny<T>())).Callback<T>((s) => sourceList.Remove(s));
return dbSet.Object;
}
Finally, the to be tested method looks like this:
public Ausweis FindeParkausweisByKennzeichen(string kennzeichen)
{
return Db.Set<Ausweis>()
.Include(x => x.Organisation)
.Include(x => x.Ersteller)
.Include(x => x.Inhaber)
.Where(x => x.Kennzeichen == kennzeichen)
.FirstOrDefault();
}
The method should return one Ausweis
but it returns with null
.
If I remove the .Where
part the first element of the data generated in dbContextMockHelper.GenerateDbSetAusweise
is returned.
What am I missing?
Can the .Where
part be mocked? If so then how?
Your SUT is accessing the db set via Db.Set<Ausweis>()
, but I can't see where you have set up this method. I believe you've set up the db set property ( dbContextMock.Ausweise = dbContextMockHelper.GetQueryableMockDbSet(liste);
) but you'll need to set up the Set<T>
method as well.
As an aside, Where
is an extension method that will either create or execute a query against the queryable provider. You can't mock it directly, you have to mock the provider.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.