在类中为Nunit测试设置私有变量

时间:2018-12-09 21:34:23

标签: c# nunit

我正在尝试为一个类编写单元测试,但是该类具有在创建类时启动的私有变量。

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 个答案:

答案 0 :(得分:2)

即使有 一种直接通过单元测试方法设置私有字段的方法,也会破坏一两个架构原则。

有几种方法可以解决此问题。最简单的解决方案是通过添加可选参数来更改ctor签名:

// constructor
public OrderFormService(IOrderItems orderItems, string orderStartingGroup = null)
{
    _orderItems = orderItems;
    _orderStartingGroup = orderStartingGroup ?? "Sales";
{

并在单元测试中使用它:

[SetUp]
public void SetUp()
{
    _orderItems = new Mock<IOrderItems>();
    _service = new OrderFormService(_orderItems, “testValue”);
}

答案 1 :(得分:1)

我认为这可能表明您做错了事。我宁愿专注于公共接口,而不是测试内部实现。如果这在公共接口中有所体现,则应该有一种方法可以通过公共接口或约定进行设置(例如从配置文件中读取)。

但是,如果您绝对需要这样做,可以考虑以下几点:

  1. 使用fabjan的答案

  2. Set private field value with reflection

  3. 将此私有成员设为受保护成员,并创建派生的测试类。