【问题标题】:Unit test doesn't work because of void method由于 void 方法,单元测试不起作用
【发布时间】:2015-02-10 23:14:18
【问题描述】:

我必须为某些方法编写一个单元测试,并且我找到了一个返回 void 的方法:

public virtual void ReadCities(string filename)
{
      var engine = new FileHelperEngine(typeof (GeoDbCity));
      _geoDbCities = engine.ReadFile(filename) as GeoDbCity[];
}

而我的测试方法是:

[Test]
public void CheckIfCitiesWereRead()
{
    var getGeoDbCitiesMock = new Moq.Mock<GeoDbReader>();
    getGeoDbCitiesMock.Setup(y => y.ReadCities("ConstCities.csv"));
    Assert.NotNull(getGeoDbCitiesMock.Object.ReadCities("ConstCities.csv"));
}

当调用 assert 时出现错误:

参数类型“void”不可分配给参数类型“object”。

我的问题是:

如何处理 void 类型的方法以及如何测试它们?在这种特殊情况下,如何测试 ReadCities 方法是否实际读取了某些内容?

【问题讨论】:

  • 执行该方法,然后检查_geoDbCities

标签: c# unit-testing


【解决方案1】:

如果一个方法没有返回任何东西,那么该方法必须有一些副作用,例如更改类的属性。测试该副作用,例如测试所述属性的值。

【讨论】:

    【解决方案2】:

    您的问题实际上包含两个问题:如何测试void() 方法,以及如何测试此ReadCities(string fileName) 方法。

    响应第一个 - 如果您的 void 方法改变了对象的内部状态,那么您可以测试:

    例子:

    public class Person
    {
        public int age;
    
        public void SetAge(int age)
        {
            this.age = age;
        }
    }
    

    那么你的测试将是

    var p = new Person();
    p.SetAge(12);
    Assert.AreEqual(p.age, 12);
    

    在回答如何测试 ReadCities 方法的问题时,您不想为了一个而模拟它。你只嘲笑你不想测试的东西——在测试中。

    将 CSV 文件添加到您的测试项目(类型 = 内容,操作 = 始终复制)并使用 DeploymentItem 属性将 CSV 文件复制到测试文件夹中。 然后用

    测试
    var service = new Service();
    service.ReadCities(pathToCsvFile);
    Assert.NotNull(service.Cities);
    // Actually - you want better assertions
    

    所以也许 ReadCities 可能是一个 void 方法,你可以在之后测试对象的内部状态,所以城市列表。 如果您不公开城市列表,还有一个叫做InternalsVisibleToAttribute 的东西允许您的测试访问私人成员。不过,我们可以先讨论一下是否需要对私有成员进行测试。

    【讨论】:

      【解决方案3】:

      从最严格的意义上说,如果您只测试 ReadCities 方法,那么您的模拟不应该测试该引擎。ReadFile 实际上做了一些事情(您将为此进行另一个单元测试)。您应该通过模拟对 engine.ReadFile 的调用来隔离此方法(我认为您已经完成了,但我对 Moq 并不完全熟悉)。

      无论如何,您可能需要做的是为 _geoDbCities 创建一个公共访问器,您可以在 Assert 中签入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多