【问题标题】:Set up Private variable in Class for Nunit Test在类中为 Nunit 测试设置私有变量
【发布时间】:2018-12-09 21:34:23
【问题描述】:

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

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 中的某些方法?如果是这样,我该怎么做?我试过用谷歌搜索它,但结果一直在谈论访问你正在测试的类中的私有变量,但这不是我想要做的。

提前致谢:)

【问题讨论】:

    标签: c# nunit


    【解决方案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】:

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

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

      1. 使用 fabjan 的答案

      2. Set private field value with reflection

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

      【讨论】:

        猜你喜欢
        • 2017-07-23
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        相关资源
        最近更新 更多