似乎模拟服务正在与消费者共享,就像模拟的接口是单例一样。如果相关,我正在使用AutoMoq / Moq组合。
class TestableClass
{
public IService service;
public TestableClass(IService s) { this.service = s }
}
Mocker.GetMock<IService>.Setup(s => s.Do()).Returns(1);
var c1 = Mocker.Resolve<TestableClass>();
var c2 = Mocker.Resolve<TestableClass>();
Assert.That(c1, Is.Not.SameAs(c2)); // true
Assert.That(c1.service, Is.NotSameAs(c2.service)) // false/fail
每次创建消费实例时,有没有办法确保IService是一个不同的实例?原因是:
Mocker.GetMock<IPauseTimer>()
.Setup(t => t.Begin(20))
.Raises(t => t.Tick += null, new PauseTimerEventArgs(1))
.Verifiable();
当我创建两个测试实例时,他们共享此单个PauseTimer
,当c1
触发Begin
函数时,c1
和c2
都会做出反应只有c1
才能参加活动。
答案 0 :(得分:1)
我通过创建另一个模拟容器来解决它,确保实例不是相同的引用。
var otherMocker = new AutoMoqer();
Mocker.GetMock<IService>.Setup(s => s.Do()).Returns(1);
otherMocker.GetMock<IService>.Setup(s => s.Do()).Returns(1);
var c1 = Mocker.Resolve<TestableClass>();
var c2 = otherMocker.Resolve<TestableClass>();
Assert.That(c1, Is.Not.SameAs(c2)); // true
Assert.That(c1.service, Is.NotSameAs(c2.service)) // true
这并不是理想的,因为所有设置工作都需要在这个其他容器上复制。辅助方法有助于:
[SetUp]
public void Setup()
{
Mocker = GetMoqer();
}
AutoMoqer GetMoqer()
{
// configure base Mocker
return new AutoMoqer();
}
[Test]
public void TestWithDifferentInstances()
{
var s1 = Mocker.ResolveMock<IService>();
var otherMocker = GetMoqer();
var s2 = otherMocker.ResolveMock<IService>();
Assert.That(s1, Is.Not.SameAs(s2));
}