我试图嘲弄一个建议响应,但是suggestionOption.Setup(x => x.Text).Returns("Hello")抛出了一个异常:
System.NotSupportedException类型的异常发生在Moq.dll中,但未在用户代码中处理附加信息:在非虚拟成员(VB中可覆盖)上的安装无效:x => x.Text。
var searchSuggestResponseMock = new Mock<ISuggestResponse>();
var suggestionOption = new Mock<SuggestOption>();
suggestionOption.Setup(x => x.Text).Returns("Hello");
suggestionOption.Setup(x => x.Payload).Returns("{path:\"drugs/hello\"}");
var suggestion = new Mock<Suggest>();
suggestion.Setup(x => x.Options).Returns(new List<SuggestOption> { suggestionOption.Object });
searchSuggestResponseMock.Setup(x => x.Suggestions).Returns(new Dictionary<string, Suggest[]>()
{
{"suggest", new Suggest[] {suggestion.Object}},
});
var mock = new Mock<IConnector>();
mock.Setup(x => x.getClient()
.Suggest<Term>(Moq.It.IsAny<Func<SuggestDescriptor<Term>,
SuggestDescriptor<Term>>>())).Returns(searchSuggestResponseMock.Object);
_connector = mock.Object;发布于 2015-10-08 02:05:10
你不能模仿非虚拟的方法。正如错误声明的那样:
Invalid setup on non-virtual memberMoq通过充当代码和实际类之间的代理来实现它的魔力。它通过利用虚拟方法来做到这一点。如果没有虚拟方法,Moq就无法拦截呼叫。
发布于 2015-10-08 09:30:13
SuggestionOption和Suggest都不是很容易模仿的,因为它们具有非虚拟的、基于内部集的属性,并且没有实现任何特定的接口。
看上去你可能在太低的水平上嘲弄。如果您不想调用弹性来获取建议列表,那么就有一个方法,它只返回一个字符串数组(或您自己的自定义建议类),然后进行模拟。
或者,只要你传递的是不返回数千条建议的合理值,就可以直接调用弹性。
(或者,理论上您可以创建建议的实例,并通过反射设置内部属性,但这显然并不理想)。
https://stackoverflow.com/questions/33000388
复制相似问题