【发布时间】:2018-03-14 18:48:12
【问题描述】:
我们使用 ReactiveUI 开发移动应用,因此使用 Splat 作为依赖注入框架。在运行我们的单元测试时,我们决定让它们并行运行以提高 IDE 中的反馈速度。我们注意到某些测试失败是因为我们的 SUT 使用了 Splat,因此我们使用 splat 在测试中注入模拟。我确信其他使用 Splat 的团队也发生过这种情况,所以我想知道是否有内置方法可以绕过这个障碍。
public interface IDependency
{
void Invoke();
}
public class SUT1
{
private IDependency dependency;
public SUT1()
{
dependency = Locator.CurrentMutable.GetService<IDependency>();
}
public void TestThis()
{
dependency.Invoke();
}
}
public class SUT2
{
private IDependency dependency;
public SUT2()
{
dependency = Locator.CurrentMutable.GetService<IDependency>();
}
public void TestThisToo()
{
dependency.Invoke();
}
}
public class SUT1_Test()
{
[Fact]
public void TestSUT1()
{
var dependencyMock = new Mock<IDependency>();
Locator.CurrentMutable.Register(() => dependencyMock.Object, typeof(IDependency));
var sut = new SUT1();
sut.TestThis();
dependencyMock.Verify(x => x.Invoke(), Times.Once);
}
}
public class SUT2_Test()
{
[Fact]
public void TestSUT2()
{
var dependencyMock = new Mock<IDependency>();
Locator.CurrentMutable.Register(() => dependencyMock.Object, typeof(IDependency));
var sut = new SUT2();
sut.TestThisToo();
dependencyMock.Verify(x => x.Invoke(), Times.Once);
}
}
如果测试以在调用函数之前注入新的模拟的方式运行,那么调用的验证将变得一团糟。禁用并行化使我们每次都能获得正确的结果,但代价是按顺序运行测试所花费的时间。
【问题讨论】:
-
提供可用于重现问题的minimal reproducible example。你更有可能通过这种方式获得帮助。
标签: c# xamarin reactiveui