假设我有几个 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/