我可以复制Moq Mock实现吗
本文关键字:实现 Mock Moq 复制 我可以 | 更新日期: 2023-09-27 18:22:18
我一直在使用Moq并喜欢它,但我在嘲笑一些遗留代码时遇到了一个问题(在我尝试重构它之前)
我真正想做的是有两个单独的mock,只有稍微不同的实现,比如下面的示例。
Mock<IFoo> fooMock = new Mock<IFoo>();
fooMock.SetupGet(f => f.bar).Returns(7);
fooMock.SetupGet(f => f.bar2).Returns(3);
Mock<IFoo> fooMockClone = new Mock<IFoo>(fooMock.Behavior);
fooMockClone.SetupGet(f => f.bar).Returns(9);
Debug.Assert(7 == fooMock.Object.bar);
Debug.Assert(9 == fooMockClone.Object.bar);
Debug.Assert(3 == fooMockClone.Object.bar2);
Debug.Assert(3 == fooMock.Object.bar2);
这是一个简单的例子,但实际的代码是一个有几十个方法的对象,我希望两个版本的实现略有不同。
感谢
在这种情况下,我想知道您是否在寻找行为测试。这是Machine中的一个示例。使用Moq子层伪造。。。它允许您想要的嵌套,同时仍然保持测试的逻辑分离。需要NuGet包:Machine.Fakes.Moq,Machine.Specifications.Should
class IFoo_test_context : WithSubject<IFoo>
{
Establish context = () => Subject.bar2 = 3;
}
class When_fooing_with_seven : IFoo_test_context
{
Establish context = () => Subject.bar = 7;
It bar_should_be_seven =()=> Subject.bar.ShouldEqual(7);
It bar2_should_be_three =()=> Subject.bar.ShouldEqual(3);
}
class When_fooing_with_nine : IFoo_test_context
{
Establish context = () => Subject.bar = 9;
It bar_should_be_nine = () => Subject.bar.ShouldEqual(9);
It bar2_should_be_three = () => Subject.bar.ShouldEqual(3);
}
同样,这个例子有点傻,因为它是在测试嘲笑行为,但很难看出你最终想要实现什么。据我所知,Mock没有你想要的复制构造函数。
您不模拟实现细节,而是模拟值,这样您就可以在代码中达到需要测试的点。编写一个测试模拟依赖项是否输出值的测试是没有意义的,那么你只是在测试moq。
例如:
public class Stuff {
IFoo _foo;
IBar _bar;
public Stuff(IFoo foo, IBar bar){
_foo = foo;
_bar = bar;
}
public void DoStuff() {
if(_foo.HasFooage) {
_bar.Bar = 4;
}
}
}
那么你的测试会是:
...
public void test_bar_does_bar() {
var foo = new Mock<IFoo>();
foo.Setup(f => f.HasFooage).Returns(true);
var bar = new Mock<IBar>();
var stuff = new Stuff(foo.Object, bar.Object);
stuff.DoStuff();
Assert.That(bar.Bar, Is.EqualTo(4));
}