gpt4 book ai didi

c# - 如何在 Moq 中设置重载方法调用?

转载 作者:太空狗 更新时间:2023-10-29 23:40:33 25 4
gpt4 key购买 nike

我正在尝试模拟一个映射接口(interface)IMapper:

public interface IMapper<TFoo, TBar> {
TBar Map(TFoo foo);
TFoo Map(TBar bar);
}

在我的测试中,我将模拟映射器设置为期望调用每个(围绕 NHibernate update 操作):

//...
_mapperMock.Setup(m => m.Map(fooMock.Object)).Returns(barMock.Object);
_mapperMock.Setup(m => m.Map(barMock.Object)).Returns(fooMock.Object);
//...

但是,当进行第二次 Map 调用时,映射器模拟会抛出异常,因为它只需要一次调用。

在运行时设置期间观察映射器模拟,我可以看到 Map(TFoo foo) 重载已注册,然后在 Map(TBar bar)< 时看到它被替换 设置了重载。

这是 Moq 处理设置的方式的问题,还是在这种情况下我需要使用不同的语法?

编辑这是来自测试构造函数的实际实例化代码:

public class TestClass {
private readonly MockRepository _repository = new MockRepository(MockBehavior.Strict);

public TestClass() {
//...
_mapperMock = _repository.Create
<IMapper<RequestData.Foo, ResponseData.Bar>>();
//...
}
}

编辑 2

这是一个完整的失败测试用例:

public interface IMapper<TFoo, TBar> {
TFoo Map(TBar bar);
TBar Map(TFoo foo);
}

public class Foo {
public override int GetHashCode() {
// return base.GetHashCode();
return 1;
}
}

public class Bar {
public override int GetHashCode() {
// return base.GetHashCode();
return 2;
}
}

[Test]
public void TestIt()
{
// Arrange
var _mapperMock = new Mock<IMapper<Foo, Bar>>(MockBehavior.Strict);
var fooMock = new Mock<Foo>();
var barMock = new Mock<Bar>();

_mapperMock.Setup(m => m.Map(fooMock.Object)).Returns(barMock.Object);
_mapperMock.Setup(m => m.Map(barMock.Object)).Returns(fooMock.Object);

// Act - breaks on first line below this comment
var bar = _mapperMock.Object.Map(fooMock.Object);
var foo = _mapperMock.Object.Map(barMock.Object);

// Assert
_mapperMock.Verify(x => x.Map(fooMock.Object), Times.Once());
_mapperMock.Verify(x => x.Map(barMock.Object), Times.Once());
}

如果我在 FooBar 或两者上注释掉 GetHashCode() 覆盖,则测试用例通过。或者,如果我不使用 FooBarMock,则测试用例通过。

编辑 3我打开了Moq Issue 347针对这个问题,有更详细的测试用例。

最佳答案

不确定你的 FooBar 类是什么样的,但我通过了这个测试(Moq 4.0.10827.0,这是 NuGet 中最新的一个)

using Moq;
using NUnit.Framework;

namespace ConsoleApplication1
{
[TestFixture]
public class Tests
{
[Test]
public void TestIt()
{
// Arrange
var _mapperMock = new Mock<IMapper<Foo, Bar>>();
var fooMock = new Mock<Foo>();
var barMock = new Mock<Bar>();

_mapperMock.Setup(m => m.Map(fooMock.Object)).Returns(barMock.Object);
_mapperMock.Setup(m => m.Map(barMock.Object)).Returns(fooMock.Object);

// Act
var bar = _mapperMock.Object.Map(fooMock.Object);
var foo = _mapperMock.Object.Map(barMock.Object);

// Assert
Assert.AreSame(bar, barMock.Object);
Assert.AreSame(foo, fooMock.Object);

_mapperMock.Verify(x => x.Map(fooMock.Object), Times.Once());
_mapperMock.Verify(x => x.Map(barMock.Object), Times.Once());
}
}

public class Bar
{
}

public class Foo
{
}
}

关于c# - 如何在 Moq 中设置重载方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11174590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com