即使是简单的起订量代码也会抛出 NotSupportedException
Even simple Moq code is throwing NotSupportedException
我一直在努力使用 Moq 作为模拟框架并复制了一些非常简单的示例代码。我一定在这里遗漏了一些非常愚蠢的东西。它在 Setup 调用中抛出 NotSupportedException,即使它指向 Returns 方法。此代码是我测试的一部分 class:
class Test
{
public string DoSomethingStringy(string s)
{
return s;
}
}
[TestInitialize]
public void Setup()
{
var mock = new Mock<Test>();
mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>()))
.Returns((string s) => s.ToLower());
}
异常错误消息可以提示您问题所在:
Invalid setup on a non-virtual (overridable in VB) member
这意味着当您模拟 class 的方法时,您只能模拟它是抽象的还是虚拟的(在您的情况下两者都不是)。
所以最简单的解决方法是使方法成为虚拟方法:
public virtual string DoSomethingStringy(string s)
{
return s;
}
您可以使用 typemock 隔离器模拟非虚拟对象,无需更改源代码即可轻松实现。
通过创建被测对象的假实例并确定被测方法的新行为。
例如,我为您发布的代码创建了一个测试:
[TestMethod]
public void TestMethod1()
{
var mock = Isolate.Fake.Instance<Test>();
Isolate.WhenCalled(() => mock.DoSomethingStringy(null)).DoInstead(contaxt =>
{
return (contaxt.Parameters[0] as string).ToLower();
});
var res = mock.DoSomethingStringy("SOMESTRING");
Assert.AreEqual("somestring", res);
}
我一直在努力使用 Moq 作为模拟框架并复制了一些非常简单的示例代码。我一定在这里遗漏了一些非常愚蠢的东西。它在 Setup 调用中抛出 NotSupportedException,即使它指向 Returns 方法。此代码是我测试的一部分 class:
class Test
{
public string DoSomethingStringy(string s)
{
return s;
}
}
[TestInitialize]
public void Setup()
{
var mock = new Mock<Test>();
mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>()))
.Returns((string s) => s.ToLower());
}
异常错误消息可以提示您问题所在:
Invalid setup on a non-virtual (overridable in VB) member
这意味着当您模拟 class 的方法时,您只能模拟它是抽象的还是虚拟的(在您的情况下两者都不是)。
所以最简单的解决方法是使方法成为虚拟方法:
public virtual string DoSomethingStringy(string s)
{
return s;
}
您可以使用 typemock 隔离器模拟非虚拟对象,无需更改源代码即可轻松实现。
通过创建被测对象的假实例并确定被测方法的新行为。
例如,我为您发布的代码创建了一个测试:
[TestMethod]
public void TestMethod1()
{
var mock = Isolate.Fake.Instance<Test>();
Isolate.WhenCalled(() => mock.DoSomethingStringy(null)).DoInstead(contaxt =>
{
return (contaxt.Parameters[0] as string).ToLower();
});
var res = mock.DoSomethingStringy("SOMESTRING");
Assert.AreEqual("somestring", res);
}