Reputation: 871
I had an initial unit test using a fake class
var dbContext = new FakeMyDbContext
{
Users = { new IdentityUser {
Id="94ccfbae-8567-405e-8e2e-70a038cdde40" }
},
};
var repository = new MyRepository<IdentityUser>(dbContext);
When I run it I have 1 user in repository, fine. I wanted however to use Moq instead so I tried this
var user = new Mock<IdentityUser>();
user.Setup(x => x.Id).Returns("94ccfbae-8567-405e-8e2e-70a038cdde40");
var users = new Mock<IDbSet<IdentityUser>>();
users.Setup(x => x.Add(user.Object));
var dbContext = new Mock<MyDbContext<IdentityUser>>();
dbContext.Setup(x => x.Users).Returns(users.Object);
var repository = new MyRepository<IdentityUser>(dbContext.Object);
But in this case the repository is empty. What am I missing? Thanks.
Update
A minor change to get the accepted answer to work. DbSet is not directly accessible so created a FakeDbSet
public class FakeDbSet<T> : IDbSet<T> where T : class
And used
var user = new IdentityUser { Id = "94ccfbae-8567-405e-8e2e-70a038cdde40" };
IDbSet<IdentityUser> users = new FakeDbSet<IdentityUser> { user };
Upvotes: 1
Views: 110
Reputation: 14053
I think that the users-mock provides no users. You mock Add() method of IDbSet<IdentityUser>
but it actually does not add anything so there are no users. You need to setup some other method which provides the users or do not mock the users at all, something like this:
IDbSet<IdentityUser> users = new DbSet<IdentityUser>
{
new IdentityUser { Id = "94ccfbae-8567-405e-8e2e-70a038cdde40" }
};
var dbContext = new Mock<MyDbContext<IdentityUser>>();
dbContext.Setup(x => x.Users).Returns(() => users);
var repository = new MyRepository<IdentityUser>(dbContext.Object);
Upvotes: 1