在较旧版本的MOQ中,以下代码可以正常工作(例如3.1.416.3)。它不再了。如何将模拟更改为工作?问题是接口继承了另一个接口并重新定义了一个字段。因此,我的模拟现在需要配置两个字段的值,因为这在我的Code1()
和Code2()
调用中使用
public interface I
{
string field { get; }
}
public interface IModi : I
{
new string field { get; set; }
}
public class P : IModi
{
private string val;
string I.field
{
get { return val; }
}
public string field
{
get { return val; }
set { val = value; }
}
public static void Code1(I p)
{
Console.WriteLine(p.field);
}
public static void Code2(IModi p)
{
Code1(p);
Console.WriteLine(p.field);
}
}
失败的测试
[TestFixture]
class MoqTests
{
[Test]
public void testinterfaces()
{
MockRepository factory = new MockRepository(MockBehavior.Strict);
var mock = factory.Create<IModi>();
mock.Setup(x => x.field).Returns("hello");
P.code2(mock.Object);
}
}
错误
Moq.MockException:I.field调用因模拟行为Strict而失败。 模拟上的所有调用都必须有相应的设置。
答案 0 :(得分:5)
使用Mock<T>.As<T>()
方法可以实现。 As()
为模拟添加了一个接口,因此允许您为不同的接口指定不同的设置。
隐藏方法/属性的警告信息(如果你问我,我通常会避免使用它们,这是非常邪恶的)。在设置最外层方法之前,您必须首先设置隐藏方法,否则最内层设置将为两个调用触发。对我来说这看起来像是一个Moq bug。
这应该有效:
[Test]
public void testinterfaces()
{
MockRepository factory = new MockRepository(MockBehavior.Strict);
var mock = factory.Create<IModi>();
mock.As<I>.Setup(x => x.field).Returns("hello");
mock.Setup(x => x.field).Returns("hello");
P.code2(mock.Object);
}