單元測試可能嗎?EF Entry.State上的單元測試失敗
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 2014-09-10 14:50:59
@Belogix我已經更新了我的問題希望它回答你的問題 – kooshka 2014-09-10 15:02:30
不,關閉但是如果你看我的答案,你需要模擬'Entry'來返回'user'而不是'State',因爲這是你的類的屬性。因此,使用我的嘲諷'Entry'的例子,然後再試一次......這樣你就可以在該模擬對象上設置狀態等。希望是有道理的! – Belogix 2014-09-11 07:56:19