2013-06-17 37 views
6

Hi nói rằng tôi có một phương pháp với chữ ký sau đây:Moq cách xác định một phương pháp được gọi với một danh sách có chứa giá trị nhất định

public void GeneratePaymentAdvise(IList<int> paymentIds) 

và điều này được gọi bằng một phương pháp khác:

public void UpdatePaymentStatus(IList<int> paymentIds, IPaymentLogic paymentLogic) 
{ 
... 
    paymentLogic.GeneratePaymentStatus(paymentIds); 
... 
} 

Vì vậy, trong một bài kiểm tra đơn vị tôi muốn chắc chắn rằng điều này đã được gọi. Sử dụng moq:

var mockPaymentLogic = new Mock<PaymentLogic>(); 

UpdatePaymentStatus(new List<int> { 2, 3 }, mockPaymentLogic.Object); 

mockPaymentLogic.Verify(x => x.GeneratePaymentStatus(It.IsAny<IList<int>>()); 

Vì vậy, điều này sẽ hoạt động tốt và kiểm tra rằng GeneratePaymentStatus được gọi nhưng chỉ được gọi với bất kỳ danh sách cũ nào của int.

Có cách nào để viết lại điều này để kiểm tra xem GeneratePaymentStatus có được gọi với danh sách các int chứa 2 và 3 không?

Trả lời

7

Something như thế:

mockPaymentLogic.Verify(x => x.GeneratePaymentStatus(It.Is<IList<int>>(l => l.Contains(2) && l.Contains(3)))); 
0

Tại sao bạn không chỉ cần sử dụng các mảng int cùng để xác minh.? Một cái gì đó như thế này ..

[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); 
} 

Nếu bạn xác minh dựa vào một danh sách khác ngoài idList, kiểm tra sẽ không thành công.

Các vấn đề liên quan