我正在尝试为DocumentDBRepository
分页代码编写单元测试。由于FeedResponse
中包含延续令牌,因此我需要模拟FeedResponse
以便为FeedResponse.ContinuationToken
放置一些值。但是问题是我收到一个错误消息:
消息:System.ArgumentException:构造函数参数不能为
通过了接口模拟。
这是否意味着我无法模拟FeedResponse
?也许我使用FeedResponse
的方式是错误的?
这是我的代码:
var response = new Mock<IFeedResponse<T>>(expected);
response.Setup(_ => _.ResponseContinuation).Returns(It.IsAny<string>());
var mockDocumentQuery = new Mock<IFakeDocumentQuery<T>>();
mockDocumentQuery
.SetupSequence(_ => _.HasMoreResults)
.Returns(true)
.Returns(false);
mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<T>(It.IsAny<CancellationToken>()))
.Returns((Task<FeedResponse<T>>)response.Object);
当我调试时,断点在
var response = new Mock<IFeedResponse<T>>(expected);
处停止,然后发生错误。 最佳答案
该错误是因为您在模拟接口并尝试传递构造函数参数。如错误消息所述,那将无法正常工作。
但是,您可以使用FeedResponse
的实际实例。
鉴于所需成员不是virtual
且也是只读的,您可以考虑对类进行存根并覆盖默认行为,因为FeedResponse<T>
不是sealed
。
例如
public class FeedResponseStub<T> : FeedResponse<T> {
private string token;
public FeedResponseStub(IEnumerable<T> result, string token)
: base(result) {
this.token = token;
}
public new string ResponseContinuation {
get {
return token;
}
}
}
并在测试中使用存根
//...
var token = ".....";
var response = new FeedResponseStub<T>(expected, token);
//...
mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<T>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);
//...
关于c# - 无法为接口(interface)模拟传递构造函数参数(模拟IFeedResponse),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51736363/