由于无效方法,单元测试不起作用

时间:2015-02-10 15:02:42

标签: c# unit-testing

我必须为某些方法编写一个单元测试,然后我找到了一个返回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"));
}

当调用断言时,我收到错误:

  

论据类型&#39;无效&#39;不能分配给参数类型&#39; object&#39;。

我的问题是:

如何处理void类型方法以及如何测试它们?在这个特殊的情况下,如何测试ReadCities方法是否真的读了一些东西?

3 个答案:

答案 0 :(得分:5)

如果方法没有返回任何内容,那么该方法必须具有一些副作用,例如更改类的属性。测试副作用,例如测试所述财产的价值。

答案 1 :(得分:1)

您的问题实际上包含两个问题:如何测试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文件添加到testproject(type = content,action = copy always),并使用DeploymentItem属性将CSV文件复制到test文件夹中。 然后用

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

所以也许ReadCities可能是一个void方法,你可以测试对象的内部状态,所以城市列表。 如果您没有公开城市列表,那么另一个名为InternalsVisibleToAttribute的东西允许您的测试访问私有成员。但是,我们可以讨论私人成员是否需要首先进行测试。

答案 2 :(得分:0)

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

在任何情况下,您可能需要做的是为_geoDbCities创建一个公共访问器,您可以在Assert中查看。