2010-02-02 29 views
12

Có thể sửa đổi thông số yêu cầu của phương thức giả không? Cụ thể là tôi đang tìm cách thay đổi buffer trong ví dụ sau đây thành một mảng byte được điền trước.Làm thế nào để sửa đổi một tham số yêu cầu của một phương pháp giả lập với Moq?

Ví dụ:
int MockedClass.Read(byte[] buffer, int offset, int count)

Giải thích:
Calling Read tải count byte đọc từ offset vào mảng byte cung cấp buffer.

Bây giờ tôi muốn có vùng đệm sau khi cuộc gọi đến Read được thực hiện trong mã ứng dụng của tôi. Điều đó có thể không?

Nếu có, tôi sẽ thực hiện các cuộc gọi liên tiếp đến số Read như thế nào? Tôi muốn các cuộc gọi liên tiếp trả về một bộ đệm khác nhau mỗi lần nếu có thể.

EDIT:

sử dụng lệnh Setup như thế này:

MockedClass.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()).Callback((byte[] buffer, int offset, int count) => buffer[0] = 0xAA);

mang lại cho tôi một vấn đề lạ khi thực hiện các thử nghiệm đơn vị: Sau khi cuộc gọi đến Read được thực hiện và các mã đại biểu (buffer[0] = 0xAA) được thực thi trình gỡ lỗi cho thấy buffer thực sự là null và việc thực hiện kiểm tra đơn vị dừng lại sau khi thực hiện lệnh này. Cú pháp của tôi có bị bẻ cong hay là một lỗi?

Trả lời

14

Bạn có thể sử dụng phương thức Gọi lại. Nội dung như thế này (từ bộ nhớ):

var buffer = new byte[64]; 
// ... 
mock.Setup(m => m.Read(buffer, offset, count)) 
    .Callback((buffer, offset, count) => /* fill in buffer here */); 
+0

Xin chào đánh dấu. Cảm ơn câu trả lời. Nếu tôi sử dụng mẫu này, kiểm thử đơn vị của tôi sẽ chỉ dừng lại ở điểm chính trong cuộc gọi lại khi ủy nhiệm được thực thi. Gỡ lỗi vấn đề cho thấy mảng byte đệm là 'null'. Bất kỳ ý tưởng nào tại sao điều đó có thể xảy ra? –

+0

Không có gì trừ khi bạn chỉ định nó. Cuộc gọi Setup ở trên không * gán * biến bộ đệm - nó khớp với biến hiện tại. Trong bản chỉnh sửa của bạn, bạn khớp trên 'It.IsAny ()', nhưng người gọi vẫn phải cung cấp giá trị. –

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