2012-07-03 14 views
27

Tôi muốn một mẫu trả về 0 lần đầu tiên, sau đó trả về 1 bất cứ khi nào phương thức được gọi. Vấn đề là nếu phương pháp được gọi là 4 lần, tôi nên viết rằng:SetupSequence trong Moq

mock.SetupSequence(x => x.GetNumber()) 
    .Returns(0) 
    .Returns(1) 
    .Returns(1) 
    .Returns(1); 

nếu không phương thức sẽ trả về null.

Có cách nào để viết rằng lần sau phương pháp được gọi sau lần đầu tiên, phương thức trả về 1 không? Cảm ơn bạn

Bạn có thể có nhiều "toán tử" hơn cho SetupSequence không? Nếu bạn nghĩ rằng YES bạn có thể bỏ phiếu: http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

Trả lời

32

Đó không phải là particulary ưa thích, nhưng tôi nghĩ rằng nó sẽ làm việc:

var firstTime = true; 

    mock.Setup(x => x.GetNumber()) 
     .Returns(()=> 
         { 
          if(!firstTime) 
           return 1; 

          firstTime = false; 
          return 0; 
         }); 
+0

Ok, tôi đang cố gắng cảm ơn bạn – Florian

+0

Hoạt động tốt! Cảm ơn bạn ! – Florian

3

Bạn có thể sử dụng một biến tạm thời để theo dõi bao nhiêu lần phương pháp này được gọi là .

Ví dụ:

public interface ITest 
{ Int32 GetNumber(); } 

static class Program 
{ 
    static void Main() 
    { 
     var a = new Mock<ITest>(); 

     var f = 0; 
     a.Setup(x => x.GetNumber()).Returns(() => f++ == 0 ? 0 : 1); 

     Debug.Assert(a.Object.GetNumber() == 0); 
     for (var i = 0; i<100; i++) 
      Debug.Assert(a.Object.GetNumber() == 1); 
    } 
} 
26

Cách sạch là tạo ra một Queue và vượt qua .Dequeue phương pháp để Returns

.Returns(new Queue<int>(new[] { 0, 1, 1, 1 }).Dequeue);

+4

Nó không hỗ trợ các cuộc gọi tiếp theo "vô hạn" ... –

+0

@RomainVerdier - Không, không. Tôi nghĩ rằng OP yêu cầu một giải pháp với 4 lời gọi. –

+3

Tất cả - tránh lỗi ban đầu của tôi. Nếu bạn định nghĩa nó sao cho bạn có Returns (myQueue.Dequeue()) thì bạn sẽ chỉ lấy lại kết quả đầu tiên - bởi vì bạn đã thực sự dequeued kết quả, thay vì cung cấp một biểu thức lambda. – sfuqua

1

Chỉ cần thiết lập một phương pháp khuyến nông như:

public static T Denqueue<T>(this Queue<T> queue) 
{ 
    var item = queue.Dequeue(); 
    queue.Enqueue(item); 
    return item; 
} 

A nd sau đó thiết lập sự trở lại như:

var queue = new Queue<int>(new []{0, 1, 1, 1}); 
mock.Setup(m => m.GetNumber).Returns(queue.Denqueue);