我正在为应用程序开发测试.有一个方法有一个params
数组作为参数.我已经使用Moq设置了该方法但是当我运行测试时,该方法的返回值为null,这意味着它没有被模拟.
这是一个代码示例:
public interface ITicketManager {
string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch);
}
public class TicketManager : ITicketManager {
private Queue<string> ticketQueue = new Queue<string>();
public string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch) {
var firstQueuedTicket = ticketQueue.Peek();
var firstQueuedTicketMatchesAnyOfRequested = ticketsToMatch.Any(t => t == firstQueuedTicket);
if(firstQueuedTicketMatchesAnyOfRequested)
return firstQueuedTicket;
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
模拟代码如下所示:
var mock = new Mock<ITicketManager>();
mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>()))
.Returns(p => {
if(p.Contains("A"))
return "A";
return null;
});
Run Code Online (Sandbox Code Playgroud)
为什么它永远不会被嘲弄的方法?
Jon*_*eet 76
你试图用一个字符串来调用一个方法,而不是一个数组.请记住,它是处理该params
部分的C#编译器,将调用代码转换为仅将单个值指定为传入数组的调用.就方法本身而言,它只是得到一个数组 - 这就是你在嘲笑的东西.
编译器实际上将您的代码转换为:
mock.Setup(m => m.GetFirstTicketInQueueIfMatches
(new string[] { It.IsAny<string>() }))
Run Code Online (Sandbox Code Playgroud)
这不是你想要的.
你应该使用:
mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string[]>()))
Run Code Online (Sandbox Code Playgroud)
如果您需要验证它只被赋予一个值,您需要以与非params参数相同的方式执行此操作.
基本上,params
只对C#编译器产生影响 - 而不是moq
.
归档时间: |
|
查看次数: |
18065 次 |
最近记录: |