【发布时间】:2014-09-10 14:45:48
【问题描述】:
是否可以对此进行单元测试?
public class MyRepository<T> where T : IdentityUser, new()
{
public async Task UpdateAsync(T user)
{
_context.Entry(user).State = EntityState.Modified;
_context.Entry(user).Property("UserName").IsModified = false;
await _context.SaveChangesAsync();
}
}
[TestInitialize] 将 1 个用户添加到存储库
_user = new IdentityUser { Id = "70a038cdde40" };
IDbSet<IdentityUser> users = new FakeDbSet<IdentityUser> { _user };
var dbContext = new Mock<MyDbContext<IdentityUser>>();
dbContext.Setup(x => x.Users).Returns(() => users);
_repository = new MyRepository<IdentityUser>(dbContext.Object);
我正在尝试用这个进行测试
private MyRepository<IdentityUser> _repository;
[TestMethod]
public async Task UpdateUser_Success2()
{
var user = await _repository.FindByIdAsync("70a038cdde40");
Assert.IsFalse(user.EmailConfirmed, "User.EmailConfirmed is True");
user.EmailConfirmed = true;
await _repository.UpdateAsync(user);
(...)
}
但它在 UpdateAsync 的第一行就死了。是测试错误还是 UpdateAsync 实现?有什么办法可以测试吗?
编辑
我按照 Belogix 的建议添加了
dbContext.Setup(x => x.Entry(It.IsAny<IdentityUser>()))
.Returns(() => dbContext.Object.Entry(_user));
我认为这让我更接近,但仍然有非虚拟错误:非虚拟成员上的无效设置:x => x.Entry(It.IsAny())
【问题讨论】:
-
在您运行测试时,
_context是什么?模拟的东西还是真实的东西(指向数据库)?您是否对相关部分进行了存根处理,以便对其进行调用? -
@Belogix 我已经更新了我的问题,希望它能回答你的问题
-
不,关闭,但是如果您查看我的答案,则需要模拟
Entry以返回user而不是State因为这是您班级的财产...所以使用我的模拟示例Entry再试一次……这样你就可以在那个模拟对象上设置状态等。希望这是有道理的! -
我确实尝试过,但返回 users[0] 不起作用,因为它无法将索引应用于类型 IDbSet
和 users.First 也不起作用,因为 IdentityUser 不能被转换为 DbEntityEntry -
Entry返回的类型必须是DbEntityEntry
类型,_user就是IdentityUser,懂我的意思吗?抱歉,我想我误删了你的评论。
标签: c# entity-framework unit-testing