我正在使用EntityFramework在MVC应用程序中工作。我为服务方法编写了microsoft单元测试用例。(我没有单独的数据访问层,我在服务方法本身访问DbContext对象。)
在服务中,我正在更新entityframework中的客户详细信息,如下所示
public void UpdateCustomer(Customer customer)
{
var existingCustomer = _dbCcontext.Customers.FirstOrDefault(x=>x.Id == customer.Id);
_dbCcontext.Entry(existingCustomer).CurrentValues.SetValues(customer);
_dbCcontext.Entry(existingCustomer).Property(x => x.CreateByUserId).IsModified = false;
_dbCcontext.Entry(existingCustomer).Property(x => x.CreateOnDateTime).IsModified = false;
}
如何为上述方法编写单元测试用例?
答案 0 :(得分:1)
为了扩展kienct89的答案,你可以做几件事来单元测试你的DbContext。
即使你没有使用单独的数据访问层,我希望你是构造函数将DbContext注入到你的服务中。如果没有,请将其更换为您。否则,你永远无法进行单元测试。
我一直使用Moq作为我的模拟框架,但其他人也有类似的功能来完成我们即将做的事情。
[TestMethod]
public void WillUpdateCustomer()
{
var mockContext = new Mock<DbContext>();
var dbCustomer = new Customer { Id = 7 }; // add other properties too
mockContext.Setup(m => m.Customers).Returns(new [] {dbCustomer}.AsQueryable());
mockContext.Setup(m => m.SaveChanges()).Returns(1);
var service = new CustomerService(mockContext.Object);
var newCustomer = new Customer { Id = 7 }; // Have different properties
service.UpdateCustomer(newCustomer);
// Having dbCustomer in here might not be right. I'm thinking reference
// as opposed to the values being equal on the object used in the call.
mockContext.Verify(m => m.Update(dbCustomer), Times.Once());
}
您在这里做的是测试您的代码,并且不允许您的测试因为与Entity Framework或数据库有关而失败。这就是单元测试的用途。有了这样的东西,你应该总是进行集成测试,这实际上是将一些东西保存到测试或虚拟数据库中,以确保你手中的代码也能完成它的工作。 / p>
大多数情况下,集成测试应该位于一个单独的项目中,或者具有不同的测试类别,以便它不会由Continuous Integration Server运行并且不断地访问数据库。
免责声明为了跟上最后一行的评论,我实际上并没有这样做,但对于你想做的事情来说这是一个好的开始。所需的任何更改都应该是次要的。
答案 1 :(得分:0)
您可以使用SqLite根据您的模型类从您的实体框架创建数据库表到系统的InMemory。稍后您可以提供服务方法完成它所需的输入。您可以跟进链接,了解如何开始使用。