用于更新实体框架

时间:2016-01-05 12:34:10

标签: c# entity-framework unit-testing

我正在使用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;
  }

如何为上述方法编写单元测试用例?

2 个答案:

答案 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。稍后您可以提供服务方法完成它所需的输入。您可以跟进链接,了解如何开始使用。

Unit Test