我正在尝试为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/

10-11 02:05