我必须为某些方法编写一个单元测试,然后我找到了一个返回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方法是否真的读了一些东西?
答案 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中查看。