在较旧版本的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);
}
}
Run Code Online (Sandbox Code Playgroud)
失败的测试
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
错误
Moq.MockException:I.field调用失败,模拟行为严格.模拟上的所有调用都必须具有相应的设置.
这是可能的使用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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2071 次 |
| 最近记录: |