2015-09-17 19 views
9

Tôi có lớp bên dưới và tôi đang cố gắng kiểm tra phương thức AddRecordToQueue.Giá trị trả về phương thức cài đặt Moq

Tôi đang sử dụng Moq để mô phỏng kết quả của phương thức AddToQueue trong phương thức AddRecordToQueue.

Phương pháp AddToQueue trả về một boolean, vì vậy tôi đang cố gắng để thử kết quả với một giá trị đích thực

public class Test 
{ 
    private readonly IRabbitMqConnection rabbitMqConnection; 

    public Test(IRabbitMqConnection rabbitMqConnection) 
    { 
     this.rabbitMqConnection = rabbitMqConnection; 

    } 

    public bool AddRecordToQueue(string messageExchange, object data) 
    { 
     var jsonified = JsonConvert.SerializeObject(data); 
     var customerBuffer = Encoding.UTF8.GetBytes(jsonified); 
     var result = this.rabbitMqConnection.AddToQueue(customerBuffer, messageExchange); 
     return result; 
    } 
} 

lớp thử nghiệm của tôi trông giống như dưới đây.

[TestClass] 
public class TestCon 
{ 
    [TestMethod] 
    public void MockTest() 
    { 
     Moq.Mock<IRabbitMqConnection> rabbitConection = new Moq.Mock<IRabbitMqConnection>(); 

     var draftContactsManager = new Test(rabbitConection.Object); 

     rabbitConection.Setup(e => e.AddToQueue(null, string.Empty)).Returns((bool res) => true); 

     var result = draftContactsManager.AddRecordToQueue("someExchange", null); 

     Assert.IsTrue(result); 
    } 
} 

Tôi dường như không thể đặt kết quả moq là đúng. bất cứ ai có thể tư vấn những gì tôi đang thiếu

nhờ

+0

Không tại một máy để kiểm tra, nhưng có hai điều tôi thấy ở đây. 1. Bạn nên 'Setup' trước khi bạn nhận được một tham chiếu đến' .Object'; 2. Trong 'Setup', bạn đặt các đối số thành null và rỗng, thử sử dụng' Setup (e => e.AddToQueue (It.IsAny(), Is.IsAny())). Returns (true)) ' – Eris

Trả lời

11

Tôi nghĩ rằng bạn cần phải thay đổi Returns chỉ trở thành sự thật thay vì lambda. Như thế này:

rabbitConection.Setup(e => e.AddToQueue(null, string.Empty)).Returns(true) 

EDIT:

Nếu điều này vẫn không làm việc thì nó có lẽ là do các thông số không phù hợp. Bạn đang đi qua trong "someExchange" nhưng giả lập được thiết lập cho chuỗi.Empty. Nếu bạn không chắc chắn giá trị nào sẽ được sử dụng, bạn có thể sử dụng phương thức It.IsAny để giải quyết vấn đề này.

rabbitConection.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())).Returns(true) 
+0

cảm ơn, nhưng điều đó không hiệu quả, nó vẫn trả về false – simon1230756

+0

Tôi đã cập nhật câu trả lời. – TomDoesCode

+0

Đẹp nhất. Cảm ơn bạn. –

2

Bạn cần thiết lập phương thức với các đối số thực tế được viện dẫn. Nếu JsonConvert.SerializeObject(data) lợi nhuận null, thì đây là thiết lập:

rabbitConection.Setup(e => e.AddToQueue(null, "someExchange")).Returns(true) 

Ngoài ra, bạn có thể thiết lập các phương pháp để trở về đúng/sai bất kể giá trị của các đối số:

rabbitConection.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())).Returns(true) 

Với thiết lập ở trên, phương pháp sẽ trả về true bất kể bạn đã chuyển cho phương thức gì. Ví dụ trước sẽ trả về true chỉ khi phương thức được gọi với các đối số đã thiết lập.

+0

Cảm ơn bạn đã giải thích. Tôi chỉ mới bắt đầu học Unit Testing với Moq –

1
  1. Như những người khác đã nói, Thiết lập không chính xác.
  2. Bạn cần phải gọi Setuptrước sử dụng liên quan đến Object

Nó phải là một cái gì đó tương tự như:

... 
rabbitConection 
    .Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())) 
    .Returns(true); 
var draftContactsManager = new Test(rabbitConection.Object); 
... 
Các vấn đề liên quan