Jacek
Jacek

Reputation: 12053

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 = "[email protected]" });
            userDbSet.Add(new UserModel { Id = 1, Username = "[email protected]" });
            userDbSet.Add(new UserModel { Id = 1, Username = "[email protected]" });

            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);
        }

Upvotes: 0

Views: 154

Answers (1)

Alexandr Sugak
Alexandr Sugak

Reputation: 171

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. E.g. should be:

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

Upvotes: 1

Related Questions