繁体   English   中英

如何使用JustMock lite和MSTest对删除方法进行单元测试?

[英]how to unit test a delete method using JustMock lite and MSTest?

我刚刚开始进行单元测试,现在却坚持编写删除的测试方法。 我正在使用MStest和JuckMock。 我的测试方法如下。 这个想法不是使用真实的存储库,而是使用JustMock模拟一个存储库,但是在代码中,我获取了一个updatedCustomer的值,并且测试方法失败了。 希望有人能指出正确的方向。

    [TestMethod]
    public void ShouldDeleteCustomerWithIdParam()
    {
        var repo = Mock.Create<ICustomerRepository>();
        var customerService = new CustomerService(repo);
        var customer = Mock.Create<Customer>();            
        customerService.Delete(customer.Id);
        var updatedCustomer = _customerService.Get(customer.Id);
        Assert.IsNull(updatedCustomer, "customer hasn't been deleted");
    }

您可以通过两种方式做到这一点。

断言已调用ICustomerRepository上的相关方法。 如果将其称为“删除”,则将为:

Mock.Assert(() => repo.Delete(), Occurs.Once());

或使用假货。 创建实现ICustomerRepository的FakeCustomerRepository。 实现添加方法以允许添加客户,并在您的测试中设置客户。 然后,删除方法仅需要删除该客户。

var repo = new FakeCustomerRepository();
repo.AddCustomer(1);
repo.AddCustomer(2);
var customerService = new CustomerService(repo); 
customerService.Delete(1);
var deletedCustomer = _customerService.Get(1);
Assert.IsNull(updatedCustomer, "customer hasn't been deleted");

您的测试似乎使用了两种不同的CustomerService :一种是测试内部创建的,是customerService ,另一种是在测试外部创建的_customerService

除此之外,由于您要模拟存储库,因此仅使用行为验证来声明预期结果会更容易。 也就是说,您实际上并不想执行删除操作,然后尝试检索已删除的客户-您只想验证customerService在提供的存储库上调用了正确的方法。

例如:

[TestMethod]
public void ShouldDeleteCustomerWithIdParam()
{
    var testID = "A test ID";
    var repo = Mock.Create<ICustomerRepository>();
    var customerService = new CustomerService(repo);
    customerService.Delete(testID);

    Mock.Assert(() => repo.DeleteCustomer(testID), Occurs.AtLeastOnce());
}

一个简短的答案和一个更长的答案:)

正如@Lilshieste指出的那样,您正在使用两个不同的存储库对象。 您的客户对象从其中一个对象中删除,然后尝试从另一个对象中检索,这可能根本就没有添加到另一个对象中。

您可能想再看看您在这里进行的测试。 假设CustomerService是围绕CustomerRepository的相当薄的包装,则此测试一旦完成就将真正完成的全部工作是通过CustomerService.Delete运行代码并检查其是否调用CustomerRepository.Delete 这个问题有两个方面:

  1. 您正在测试一类是怎么做的工作,而不是类做什么 这将测试与类耦合在一起,并要求测试了解与CustomerService无关的事情。

  2. 当此代码在没有模拟的情况下运行时,我假设您正在使用ORM或ADO.NET从数据存储中实际删除某项- 这是您希望确保可以正常运行的行为,但是您正在模拟该行为。 有一个测试说“删除客户有效!” 但实际上并未测试真实的客户删除代码可能具有欺骗性。

考虑到这一点,我不会说您正在编写的测试实际上会给您带来很多好处。 我建议将其更改为一个集成测试,该测试实际上会命中您的数据存储并执行实际的删除代码。

吉米·博加德(Jimmy Bogard) 在此处撰写了有关单元测试存储库的文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM