使用StorageFile作为参数的C#测试方法

3

首先,这是一个Microsoft Store winrt库,我正在尝试测试具有以下签名的公共方法:

string GetStringFromFile(StorageFile storageFile);

但是StorageFile没有构造函数,所以我不能在我的NUnit测试代码中创建它。此外,我认为我不能在WinRt上使用Moq或任何其他Mocking库。

我一直在寻找从IStorageFile接口创建手工伪造文件的方法,但它里面有很多方法,而且我再次陷入了另一个深层属性的问题,这些属性指向StorageFile内部没有公共构造函数的类,例如ImageProperties

那么...什么是测试带有StorageFile和/或ImageProperties类的最佳方式?


1
你可以创建一个StorageFileWrapper类,它以IStorageFile作为其构造函数的参数。通过这个包装器,你可以创建任何你想要的方法,将调用转发到被包装的对象。 - Christian
2个回答

5

StorageFile类实现了一个接口IStorageFile,因此您应该将依赖项更改为该接口,然后可以使用模拟或存根(如果无法使用Moq等,则可能是您创建的类)。


编程时,使用接口而不是具体类进行模拟测试是一个好方法。 - ChrisF
你应该始终依赖于抽象而不是实现,这不仅使得模拟更容易(这是SOLID原则中的D),而且有助于代码的可维护性和扩展性。 - Trevor Pilley
好的,也许我没有用正确的方式表达我的问题。StorageFileIStorageFile接口,我知道。但是在我的例子中,ImageProperties并没有任何实现属性CameraManufacturer的接口。如何测试这第二个类? - ferpega
@Ferpega 哦,好的,我现在明白你的意思了。看起来接口没有包含类所指定的所有属性。基于此,你有两个选择。1)创建一个包装类,它公开自己的接口,你可以针对其进行编程;2)使参数类型动态化,然后你可以发送任何具有正确属性名称的内容。 - Trevor Pilley
@Trevor Pilley 我理解两种方法,但我认为我更喜欢包装器的方式。 :-) 谢谢。 - ferpega

0

假设这个方法是你自己的,而不是在另一个你无法控制的库中;我建议你改变签名,使参数类型为IStorageFile而不是具体类。然后,在测试中你可以创建一个虚拟的IStorageFile对象,但在应用程序中使用真实的StorageFile。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接