我正在尝试为类编写单元测试,但该类在创建类时启动了一个私有变量 .
public class OrderFormService : IOrderFormService
{
private readonly IOrderItems _orderItems;
private readonly string _orderStartingGroup;
// constructor
public OrderFormService(IOrderItems orderItems)
{
_orderItems = orderItems;
_orderStartingGroup = "Sales";
{
// Other Methods
}
我正在尝试编写单元测试并测试此类中的方法,它使用变量_orderStartingGroup ...
[TestFixture]
public class OrderFormServiceTests
{
private ITreatmentFormService _service;
private Mock<IOrderItems> _orderItems;
[SetUp]
public void SetUp()
{
_orderItems = new Mock<IOrderItems>();
_service = new OrderFormService(_orderItems);
}
}
是否可以在OrderFormServiceTest中设置_orderStartingGroup,以便它可以在单元测试中用于测试OrderFormService中的某些方法?如果是这样,我该怎么做呢?我试过谷歌搜索它,但结果一直在讨论在你正在测试的类中访问私有变量,但这不是我想要做的 .
提前致谢 :)
2 回答
即使有一种直接从单元测试方法设置私有字段的方法,它也会打破一两个架构原则 .
有几种方法可以解决这个问题 . 最简单的解决方案是通过添加可选参数来更改ctor签名:
并在单元测试中使用它:
我认为这可能表明你做错了什么 . 我宁愿专注于公共接口而不是测试内部实现 . 如果这在某种程度上反映在公共接口中,应该有一种方法通过公共接口或约定来设置它(比如从配置文件中读取) .
但如果您绝对需要这样做,您可以考虑以下事项:
使用fabjan的答案
Set private field value with reflection
将此私有成员设为受保护并创建派生测试类 .