嗨说我有一个带有以下签名的方法:
public void GeneratePaymentAdvise(IList<int> paymentIds)
,这是通过另一种方法调用的:
public void UpdatePaymentStatus(IList<int> paymentIds, IPaymentLogic paymentLogic)
{
...
paymentLogic.GeneratePaymentStatus(paymentIds);
...
}
所以在单元测试中我想确保调用它。使用moq:
var mockPaymentLogic = new Mock<PaymentLogic>();
UpdatePaymentStatus(new List<int> { 2, 3 }, mockPaymentLogic.Object);
mockPaymentLogic.Verify(x => x.GeneratePaymentStatus(It.IsAny<IList<int>>());
所以这样可以正常工作并检查GeneratePaymentStatus是否被调用但只有使用任何旧的int列表调用。
有没有办法重写这个,所以它测试GeneratePaymentStatus是用一个包含2和3的整数列表调用的?
答案 0 :(得分:15)
类似的东西:
mockPaymentLogic.Verify(x => x.GeneratePaymentStatus(It.Is<IList<int>>(l => l.Contains(2) && l.Contains(3))));
答案 1 :(得分:0)
为什么不直接使用相同的int数组进行验证。像这样......
[TestClass]
public class SomeClassTests
{
[TestMethod]
public void UpdatePaymentStatus_PaymentIds_VerifyPaymentLogicGeneratePaymentStatus() {
var mock = new Mock<IPaymentLogic>();
var sut = new Sut();
var idList = new List<int> {2, 3};
sut.UpdatePaymentStatus(idList, mock.Object);
mock.Verify(x => x.GeneratePaymentStatus(idList));
}
}
public class Sut {
public void UpdatePaymentStatus(IList<int> paymentIds, IPaymentLogic paymentLogic) {
paymentLogic.GeneratePaymentStatus(paymentIds);
}
}
public interface IPaymentLogic {
void GeneratePaymentStatus(IList<int> paymentIds);
}
如果您使用除idList之外的其他列表进行验证,则测试将失败。