1

似乎模拟服务正在与消费者共享,就好像模拟接口是单例的。如果相关,我正在使用 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函数时,两者都c1c2事件做出反应,什么时候才c1应该。

4

1 回答 1

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));
}
于 2013-12-02T05:01:24.620 回答