Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用JustMock-lite和MSTest对delete方法进行单元测试?_C#_Unit Testing_Mstest_Justmock - Fatal编程技术网

C# 如何使用JustMock-lite和MSTest对delete方法进行单元测试?

C# 如何使用JustMock-lite和MSTest对delete方法进行单元测试?,c#,unit-testing,mstest,justmock,C#,Unit Testing,Mstest,Justmock,我刚刚开始单元测试,现在一直在为delete编写测试方法。我正在使用MStest和JuckMock。我的测试方法如下。我们的想法不是使用真实的存储库,而是使用JustMock来模拟一个存储库,但是在代码中,我得到了updatedCustomer的一个值,测试方法失败了。希望有人能给我指出正确的方向 [TestMethod] public void ShouldDeleteCustomerWithIdParam() { var repo = Mock.Cre

我刚刚开始单元测试,现在一直在为delete编写测试方法。我正在使用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");
    }
[TestMethod]
public void应删除CustomerWithidparam()
{
var repo=Mock.Create();
var customerService=新客户服务(repo);
var customer=Mock.Create();
customerService.Delete(customer.Id);
var updatedCustomer=\u customerService.Get(customer.Id);
IsNull(updatedCustomer,“客户尚未被删除”);
}

您可以通过两种方式完成

断言已调用ICCustomerRepository上的相关方法。如果称为删除,则为:

Mock.Assert(() => repo.Delete(), Occurs.Once());
或者用假的。创建FakeCustomerRepository实现ICCustomerRepository。实现add方法以允许添加客户,并在测试中在其中设置客户。然后,delete方法只需要删除该客户

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");

你可以用两种方法来做

断言已调用ICCustomerRepository上的相关方法。如果称为删除,则为:

Mock.Assert(() => repo.Delete(), Occurs.Once());
或者用假的。创建FakeCustomerRepository实现ICCustomerRepository。实现add方法以允许添加客户,并在测试中在其中设置客户。然后,delete方法只需要删除该客户

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
,另一种是在测试外部创建的
\u 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());
}
[TestMethod]
public void应删除CustomerWithidparam()
{
var testID=“测试ID”;
var repo=Mock.Create();
var customerService=新客户服务(repo);
customerService.Delete(testID);
Assert(()=>repo.DeleteCustomer(testID),Occurs.AtLeastOnce();
}

您的测试似乎使用了两种不同的
CustomerService
s:一种是在测试内部创建的
CustomerService
,另一种是在测试外部创建的
\u 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());
}
[TestMethod]
public void应删除CustomerWithidparam()
{
var testID=“测试ID”;
var repo=Mock.Create();
var customerService=新客户服务(repo);
customerService.Delete(testID);
Assert(()=>repo.DeleteCustomer(testID),Occurs.AtLeastOnce();
}

简短的回答和较长的回答:)

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

您可能想再看看您在这里测试的内容。假设
CustomerService
CustomerRepository
的一个相当薄的包装,那么一旦完成,这个测试真正要做的就是通过
CustomerService.Delete
运行代码,并检查它调用
CustomerRepository.Delete
。这有两个问题:

  • 你在测试一个类是如何完成它的工作的,而不是该类做什么。这将测试与类耦合,并要求测试了解与
    CustomerService
    无关的内容

  • 当这段代码在没有模拟的情况下运行时,我假设您正在使用ORM或ADO.NET从数据存储中实际删除一项—这是您希望确保工作正常的行为,但您正在模拟它。有一个测试说“删除客户有效!”但实际上并没有测试真正的客户删除代码可能是骗人的

  • 考虑到这一点,我不会说你正在写的测试实际上对你很有帮助。我建议将它改为一个集成测试,它将实际访问您的数据存储并执行真正的删除代码


    Jimmy Bogard写了一篇关于单元测试存储库的文章。

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

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

    您可能想再看看您在这里测试的内容。假设
    CustomerService
    CustomerRepository
    的一个相当薄的包装,那么一旦完成,这个测试真正要做的就是通过
    CustomerService.Delete
    运行代码,并检查它调用
    CustomerRepository.Delete
    。这有两个问题:

  • 你在测试一个类是如何完成它的工作的,而不是该类做什么。这将测试与类耦合,并要求测试了解与
    CustomerService
    无关的内容

  • 当这段代码在没有模拟的情况下运行时,我假设您正在使用ORM或ADO.NET从数据存储中实际删除一个项—这就是您想要的行为