unit-testing - 对工厂方法进行单元测试

标签 unit-testing nunit moq

假设我有几个 OrderProcessor s,他们每个人处理订单的方式都略有不同。
关于哪个OrderProcessor的决定使用是根据 Order 的属性完成的对象,并由工厂方法完成,如下所示:

public IOrderProcessor CreateOrderProcessor(IOrdersRepository repository, Order order, DiscountPercentages discountPercentages)
{
    if (order.Amount > 5 && order.Unit.Price < 8)
    {
        return new DiscountOrderProcessor(repository, order, discountPercentages.FullDiscountPercentage);
    }

    if (order.Amount < 5)
    {
        // Offer a more modest discount
        return new DiscountOrderProcessor(repository, order, discountPercentages.ModestDiscountPercentage);
    }

    return new OutrageousPriceOrderProcessor(repository, order);
}

现在,我的问题是我想验证返回的 OrderProcessor已收到正确的参数(例如,正确的折扣百分比)。
但是,这些属性在 OrderProcessor 上并不公开。实体。

你会建议我如何处理这种情况?

我能想出的唯一解决方案是设置 OrderProcessor 的折扣百分比属性。是公开的,但仅仅为了单元测试的目的这样做似乎有点矫枉过正......

最佳答案

解决此问题的一种方法是将要测试的字段更改为内部字段而不是私有(private)字段,然后将项目的内部设置为对测试项目可见。你可以在这里阅读:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

你会在你的 AssemblyInfo.cs 文件中做这样的事情:

[assembly:InternalsVisibleTo("Orders.Tests")]

尽管您可能会争辩说您的单元测试不一定要关心您类(class)的私有(private)字段。当在接口(interface)上调用某些方法(假设 Calculate() 或类似的东西)时,最好将值传递给工厂方法并为预期结果编写单元测试。

或者另一种方法是对具体类型(DiscountOrderProcessor 等)进行单元测试,并从公共(public)方法/属性中确认它们的返回值。然后为工厂方法编写单元测试,它正确地返回正确类型的接口(interface)实现。

这些是我在编写类似代码时通常采用的方法,但是有很多不同的方法可以解决这样的问题。我建议弄清楚在单元测试中你会在哪里获得最大的值(value),并据此编写。

关于unit-testing - 对工厂方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606357/

相关文章:

c# - 如何在 Moq 的 SetUpSequence 上使用回调?

unit-testing - 起订量:如何清除对模拟对象的期望?

Python:使用用于单元测试的文件创建模拟或假目录

java - 通过 Maven 从内部类运行测试

javascript - Angular 2 Http请求 promise 返回区域对象而不是实际数据

c# - 在托管代码中集成测试来自 NUnit 的 C++ 代码

c# - Moq 中 SetupSet 和 SetupProperty 的区别

linq - 人们如何对使用 Linq to SQL 的代码进行单元测试

c# - NSubstitute - TestFixture 1 在 TestFixture 2 中导致 AmbiguousArgumentsException

c# - 使用数组或泛型时 TestCase 在 NUnit 中的显示名称