C# 防止Moq创建单例模拟

C# 防止Moq创建单例模拟,c#,moq,automoq,C#,Moq,Automoq,似乎模拟的服务正在与消费者共享,就好像模拟的接口是单例的一样。如果相关的话,我正在使用自动最小起订量/最小起订量组合 class TestableClass { public IService service; public TestableClass(IService s) { this.service = s } } Mocker.GetMock<IService>.Setup(s => s.Do()).Returns(1); var c1 = Mo

似乎模拟的服务正在与消费者共享,就好像模拟的接口是单例的一样。如果相关的话,我正在使用自动最小起订量/最小起订量组合

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
class可测试类
{ 
公共服务;
公共可测试类(IService s){this.service=s}
}
Mocker.GetMock.Setup(s=>s.Do()).Returns(1);
var c1=Mocker.Resolve();
var c2=Mocker.Resolve();
Assert.That(c1,Is.Not.SameAs(c2));//真的
Assert.That(c1.service,Is.NotSameAs(c2.service))//false/fail
有没有办法确保每次创建消费实例时iSeries都是不同的实例?原因是:

Mocker.GetMock<IPauseTimer>()
    .Setup(t => t.Begin(20))
    .Raises(t => t.Tick += null, new PauseTimerEventArgs(1))
    .Verifiable();
Mocker.GetMock()
.Setup(t=>t.Begin(20))
.Raises(t=>t.Tick+=null,新的PauseTimerEventArgs(1))
.可验证();

当我创建两个测试实例时,它们共享这个
PauseTimer
,当
c1
触发
Begin
函数时,
c1
c2
都会对事件做出反应,而只有
c1
应该这样做。

我通过创建另一个模拟容器来解决这个问题,这确保了实例不是相同的引用

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
var otherMocker=new AutoMoqer();
Mocker.GetMock.Setup(s=>s.Do()).Returns(1);
Setup(s=>s.Do())。返回(1);
var c1=Mocker.Resolve();
var c2=otherMocker.Resolve();
Assert.That(c1,Is.Not.SameAs(c2));//真的
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));
}
[设置]
公共作废设置()
{
Mocker=GetMoqer();
}
自动moqer GetMoqer()
{ 
//配置基本模拟程序
返回新的AutoMoqer();
}
[测试]
具有不同状态的公共无效测试()
{
var s1=Mocker.ResolveMock();
var otherMocker=GetMoqer();
var s2=otherMocker.ResolveMock();
断言(s1,Is.Not.SameAs(s2));
}

我通过创建另一个模拟容器来解决这个问题,确保实例不是相同的引用

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
var otherMocker=new AutoMoqer();
Mocker.GetMock.Setup(s=>s.Do()).Returns(1);
Setup(s=>s.Do())。返回(1);
var c1=Mocker.Resolve();
var c2=otherMocker.Resolve();
Assert.That(c1,Is.Not.SameAs(c2));//真的
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));
}
[设置]
公共作废设置()
{
Mocker=GetMoqer();
}
自动moqer GetMoqer()
{ 
//配置基本模拟程序
返回新的AutoMoqer();
}
[测试]
具有不同状态的公共无效测试()
{
var s1=Mocker.ResolveMock();
var otherMocker=GetMoqer();
var s2=otherMocker.ResolveMock();
断言(s1,Is.Not.SameAs(s2));
}

如果有更简单的方法,我很乐意接受除此之外的答案。如果有更简单的方法,我很乐意接受除此之外的答案。我理解这个问题(以及您的解决方案)。但很难理解你到底在测试什么。
PauseTimer
如何适应上面的TestableClass?你确定你在用最好的方式写你的测试吗?这个问题让我觉得这里有些奇怪。@MEMark测试的最初目的是验证同步性。不应共享计时器,但
TestableClass
应向另一个
TestableClass
发送消息,以便计时器状态可以同步。基本上,每个类中都有一个秒表,但只触发一个秒表,这将更新这两个类的UI。秒表不能是单对的,因为在整个程序中可以有多对。我理解这个问题(以及您的解决方案)。但很难理解你到底在测试什么。
PauseTimer
如何适应上面的TestableClass?你确定你在用最好的方式写你的测试吗?这个问题让我觉得这里有些奇怪。@MEMark测试的最初目的是验证同步性。不应共享计时器,但
TestableClass
应向另一个
TestableClass
发送消息,以便计时器状态可以同步。基本上,每个类中都有一个秒表,但只触发一个秒表,这将更新这两个类的UI。秒表不能是单对的,因为在整个程序中可以有多对。