【发布时间】:2014-09-23 13:57:07
【问题描述】:
我有一个类似于this one的问题。
但是,在我的情况下,没有一个答案是可以接受的。我已经实现了 Microsoft 建议 here 的几个类,并且一直在努力解决我认为很常见的场景。
我需要测试在控制器操作中创建的项目是否正确保存到数据库中。这是控制器方法:
[HttpPost]
[ActionName("CreateUser")]
public virtual async Task<IHttpActionResult> CreateUser(RegisterViewModel viewModel)
{
ApplicationUser user = new ApplicationUser(false, true, true, viewModel.UserName,
viewModel.FirstName, viewModel.LastName, viewModel.EmailAddress);
try
{
user.Salt = HashUtilities.GetSalt();
user.Password = HashUtilities.GetHashedValue(viewModel.Password, user.Salt);
// This is what I want to assert happened
_dbContext.ApplicationUsers.Add(user);
await _dbContext.SaveChangesAsync();
return Ok(user);
}
catch (DbEntityValidationException ex)
{
List<string> messages = new List<string>();
foreach (DbEntityValidationResult eve in ex.EntityValidationErrors)
foreach (DbValidationError dve in eve.ValidationErrors)
messages.Add(dve.ErrorMessage);
string message = string.Join("\n\n", messages);
return BadRequest(message);
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
这是我的测试。 InMemoryAsyncQueryable 等一些类/方法实现直接从 MS 对 codeplex 链接的建议中复制而来。
// Arrange
var viewModel = new RegisterViewModel
{
ConfirmPassword = "abc123",
EmailAddress = "Test@test.com",
FirstName = "Test",
LastName = "User1",
Password = "abc123",
UserName = "TestUser1"
};
var queryableUsers = new List<ApplicationUser>().AsQueryable();
var users = DataUtilities.CreateMockQueryableSet<ApplicationUser>(new InMemoryAsyncQueryable<ApplicationUser>(queryableUsers));
var mockContext = new Mock<MainContext>();
mockContext.Setup(x => x.ApplicationUsers).Returns(users.Object);
var controller = new ApplicationUserController(mockContext.Object);
// Act
var result = controller.CreateUser(viewModel).Result;
// Assert
Assert.IsInstanceOf<OkNegotiatedContentResult<ApplicationUser>>(result);
mockContext.Verify(x => x.SaveChangesAsync());
// Test for persistence to the DbSet this is what is breaking down.
// My ApplicationUsers.Count() is 0 when I'm expecting 1.
Assert.AreEqual(mockContext.Object.ApplicationUsers.Count(), 1);
var testUser = mockContext.Object.ApplicationUsers.First();
【问题讨论】:
标签: entity-framework nunit moq