简体   繁体   中英

Mocking DbSet.Where(lambda) with Moq

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM