我在VS2017中有一个Xamarin解决方案,该解决方案在Windows UWP和Android上实现了几次物理设备(通过USB /串行和蓝牙)。这些设备都实现了IMyDevice,该IMyDevice定义了一个简单的状态机,该状态机对MyDevice是否连接以及是否进行测量进行建模。
我在各自的名称空间中使用Xunit测试了这些实现,并且由于它们都实现了IMyDevice,因此我得到了相当多的测试,这些测试实际上是相同的,并且目前重复了3次。我将很快添加更多设备,并且必须找到一种方法来防止这种重复完全失控。
要测试我的视图模型,我在一个单独的通用命名空间中构建一个程序集,并将其包含在我的各种单元测试项目中,使用:
AddTestAssembly(typeof(MyViewModel).GetTypeInfo().Assembly);
这适用于视图模型,因为我不需要任何特定于平台的类型,但是,a,我认为我无法将MyDevice实现传递给已经构建的程序集!
一种更可行的方法是使用Xamarin的依赖项服务
DependencyService.Get<MyDevice>();
但是,我的串行/蓝牙单元测试应该要求使用Xamarin形式,这在概念上对我来说似乎是错误的。而且我不确定是否会完成,因为我仍然需要消除Windows上的串行和蓝牙设备的歧义。
因此,我亲手写了它。我在两个项目/命名空间中使用Xuint:
namespace Test.MyApp.UWP {
public class TestMyBluetoothDeviceUWP {
[Fact]
void DeviceDoesntSuck() {
Assert.False(new MyUWPBluetoothDevice().sucks());
}
}
public class TestMySerialDeviceUWP {
[Fact]
void DeviceDoesntSuck() {
Assert.False(new MyUWPSerialDevice().sucks());
}
}
}
namespace Test.MyApp.Droid{
public class TestMyDeviceDroid {
[Fact]
void DeviceDoesntSuck() {
Assert.False(new MyDeviceDroid().sucks());
}
}
}
类似于我的问题的流行答案似乎是在使用[理论]
namespace Test.MyApp{
public class TestMyDevice {
[Theory]
[ClassData new MyUWPBluetoothDevice()]
[ClassData new MyUWPSerialDevice()]
[ClassData new MyDeviceDroid()]
void DeviceDoesntSuck(IMyDevice myDevice) {
Assert.False(myDevice.sucks());
}
}
}
这对于在相同名称空间中定义的设备有所帮助,但是对测试项目(命名空间)中的重复没有帮助
到目前为止,我能想到的最好的解决方案(不是那么好)是静态定义测试,并将其包装在测试项目的调用程序中
namespace Test.MyApp{
public static class TestMyDevice {
static void DeviceDoesntSuck(IMyDevice myDevice) {
Assert.False(myDevice.sucks());
}
}
}
namespace Test.MyApp.UWP {
public class TestMyDeviceUWP {
[Theory]
[ClassData new MyUWPBluetoothDevice()]
[ClassData new MyUWPSerialDevice()]
void DeviceDoesntSuck(IMyDevice myDevice) {
Test.MyApp.TestMyDevice.DeviceDoesntSuck(myDevice);
}
}
}
namespace Test.MyApp.Droid{
public class TestMyDeviceDroid {
[Fact]
void DeviceDoesntSuck() {
Test.MyApp.TestMyDevice.DeviceDoesntSuck(new MyDeviceDroid());
}
}
}
这是更容易维护的,因为每个测试只有一个实现,但是由于必须将每个封装在每个平台上,因此仍然有很多重复
总而言之,如果有人知道如何:针对生活在不同项目/命名空间中的,依赖于运行时的接口的不同实现进行一整套测试,我将非常有兴趣听到您要说的话。 / p>