首页 文章

在Class中为Nunit Test设置私有变量

提问于
浏览
2

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

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 回答

  • 1

    即使有一种直接从单元测试方法设置私有字段的方法,它也会打破一两个架构原则 .

    有几种方法可以解决这个问题 . 最简单的解决方案是通过添加可选参数来更改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”);
    }
    
  • 2

    我认为这可能表明你做错了什么 . 我宁愿专注于公共接口而不是测试内部实现 . 如果这在某种程度上反映在公共接口中,应该有一种方法通过公共接口或约定来设置它(比如从配置文件中读取) .

    但如果您绝对需要这样做,您可以考虑以下事项:

相关问题