【问题标题】:Can/should model contain properties/variables only for unit testing?模型可以/应该包含仅用于单元测试的属性/变量吗?
【发布时间】:2019-08-31 14:46:15
【问题描述】:

模型中存储的数据的常见/最佳做法是什么。我正在为计算编写单元测试,并且我有一个属性,它返回实际用于在数据库中存储数据的其他属性的值。在模型中它是这样定义的

    bool IsDebtAndPayCurrencyTheSame;

    public decimal leftOverDebtInSystemCurrencyForDate
    {
        get { return IsDebtAndPayCurrencyTheSame ? debt.allDebt.systemCurrency : Math.Round(debt.leftOverDebt.documentCurrency * Convert.ToDecimal(DebtCurrencyKoefPayoDate), 2); }
    }

单元测试看起来像这样

        Assert.AreEqual(100, income.detailRow[0].account.leftOverDebtInSystemValueForDate);

那么我应该将leftOverDebtInSystemCurrencyForDate 留在模型中还是将其逻辑复制到单元测试中?

【问题讨论】:

  • 我们应该怎么知道?如果该成员显然属于您的模型,那么它肯定应该在那里实现。这里没有什么专门针对测试的,都是关于类设计的。
  • 从不建议仅为单元测试创​​建模型,您可能应该只使用逻辑

标签: c# unit-testing model-view-controller model


【解决方案1】:

模型可以包含仅用于单元测试的属性吗?

嗯,没有限制。你可以添加任何你想要的属性。

你应该这样做吗?

没有。添加此类属性不是一个好习惯。同样,这完全取决于您要如何设计课程。根据抽象和封装规则,您应该只向类消费者公开所需的属性。

理想情况下,在单元测试中,您也应该检查正在测试的类/方法的最终结果,而不是测试内部/私有变量。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果leftOverDebtInSystemCurrencyForDate 与您的应用程序完全无关,则应将其从您的代码中删除。

    如果您的应用程序(单元测试除外)访问了leftOverDebtInSystemCurrencyForDate,则它应该保留在您的模型中或被提取到服务中。

    单元测试不应包含leftOverDebtInSystemCurrencyForDate 的任何逻辑。

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2017-07-26
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      相关资源
      最近更新 更多