c# - 如何对不可变类构造函数进行单元测试?

标签 c# unit-testing

我有一个不可变类,其中包含在构造函数执行期间设置的一些私有(private)字段。我想对这个构造函数进行单元测试,但我不确定这种情况下的“最佳实践”。

简单示例

此类在 Assembly1 中定义:

public class Class2Test
{
    private readonly string _StringProperty;

    public Class2Test()
    {
        _StringProperty = ConfigurationManager.AppSettings["stringProperty"];
    }
}

此类在 Assembly2 中定义:
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Class2Test_Default_Constructor()
    {
        Class2Test x = new Class2Test();
        //what do I assert to validate that the field was set properly?
    }
}

编辑 1 :我已经用一个潜在的解决方案回答了这个问题,但我不确定这是否是“正确的方法”。因此,如果您认为自己有更好的想法,请发布。

这个例子真的不值得测试,但假设构造函数有一些更复杂的逻辑。如果类上方法的所有测试都有效,那么避免测试构造函数并假设它有效的最佳方法是什么?

编辑 2 : 看起来我做的样本有点简单。我已经用更合理的情况更新了它。

最佳答案

什么都没有,除非您使用该字段。您不希望通过测试进行过度规范。换句话说,不需要测试赋值运算符是否有效。

如果您在方法或其他东西中使用该字段,请调用该方法并对其进行断言。

编辑:

assume the constructor has some more complex logic



您不应该在构造函数中执行任何逻辑。

编辑2:

public Class2Test()
{
     _StringProperty = ConfigurationManager.AppSettings["stringProperty"];
}


不要那样做! =) 你的简单单元测试现在变成了集成测试,因为它依赖于多个类的成功运行。编写一个处理配置值的类。 WebConfigSettingsReader 可以是名称,它应该封装 ConfigurationManager.AppSettings称呼。将 SettingsReader 类的实例传递给 Class2Test 的构造函数.然后,在你的单元测试中,你可以模拟你的 WebConfigSettingsReader并保留对您可能对其进行的任何调用的响应。

关于c# - 如何对不可变类构造函数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/130730/

相关文章:

php - Laravel 5 单元测试。无法设置请求对象的 JSON

javascript - 为什么这个 chai-as-promised AssertionError 打印到控制台而不是我的 Mocha 测试运行程序?

ios - 使用 Realm 数据库进行 XCTest 单元测试中的 RLMException

c# - 如何在 WPF 中绑定(bind)对象的两个实例(或者我可以吗?)

c# - 如何 ping 网站并在 gridview 中显示状态

c# - 将 Entity Framework 创建的数据库中的项目加载到助手的下拉列表中

python - 我需要在哪里放置我的 Django 测试以便它们被执行?

python - 断言对 __iter__() 方法的模拟调用

c# - Serilog 中不同级别的不同日志文件

c# - 进程启动是否使用另一个线程?