阻止Moq创建单身模拟

时间:2013-12-02 03:15:02

标签: c# moq automoq

似乎模拟服务正在与消费者共享,就像模拟的接口是单例一样。如果相关,我正在使用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才能参加活动。

1 个答案:

答案 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));
}