简体   繁体   中英

InMemoryDb unit test exception

I try to write unit test for repository. I use InMemoryDb ( https://www.nuget.org/packages/FakeDbSet ) set to mock DbSet but I get exception

"Expression is not a method invocation: p => p".

What do I there wrong?

        try
        {
            var userDbSet = new InMemoryDbSet<UserModel>();
            userDbSet.Add(new UserModel { Id = 1, Username = "jacek_001@wp.pl" });
            userDbSet.Add(new UserModel { Id = 1, Username = "jacek_002@wp.pl" });
            userDbSet.Add(new UserModel { Id = 1, Username = "jacek_003@wp.pl" });

            var repositoryMock = new Mock<IDbSet<UserModel>>();
            repositoryMock.Setup(p => p).Returns(() => userDbSet); // <= this line throw exception

            var entitiesMock = new Mock<Entities>();
            entitiesMock.Setup(p => p.Users).Returns(() => repositoryMock.Object);

            return entitiesMock.Object;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

InMemoryDbSet already implements IDbSet so you don't need to do a mock of it. Simply pass userDbSet to the method/constructor which requires IDbSet instance.

As for the error you get, Setup method requires an expression which results in method(or property getter) invocation but you have provided an "instance" result expression. Eg should be:

var repositoryMock = new Mock<IDbSet<UserModel>>();
repositoryMock.Setup(p => p.SomeMethod()).Returns(() => stubData); 

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