2013-09-04 19 views
9

Tôi hiện đang viết kiểm tra đơn vị và chế nhạo một phụ thuộc bằng cách sử dụng khung công tác Moq. Để làm được điều này, tôi đã tạo ra một Mock như vậy:Alter Mock <IType> đối tượng sau. Bất động sản đã được gọi là

Mock<ITraceProvider> traceProviderMock = new Mock<ITraceProvider>(); 
traceProviderMock.Setup(x => x.GetTraceContext(It.IsAny<string>())).Returns("test"); 
ITraceProvider traceObj = traceProviderMock.Object; 

Tuy nhiên sau này tôi muốn thay đổi hành vi của các mô hình nhiều hơn một chút vì vậy tôi gọi Setup trên đối tượng Mock một lần nữa:

traceProviderMock.Setup(x => x.GetTracer(It.IsAny<string>())).Returns("tracer"); 

Bây giờ mà không cần gọi lại traceProviderMock.Object, hành vi giả lập mới này có được phản ánh trong traceObj không? Đó là những gì tôi muốn là trường hợp.

Điều này chắc chắn phù hợp với phương pháp Verify() nhưng không xuất hiện cho phương thức Setup.

Lý do tôi muốn làm điều này, là do thực tế tôi đã xây dựng biểu đồ phụ thuộc đầy đủ trong phương pháp Thiết lập thử nghiệm bằng cách sử dụng phụ thuộc giả định. Tôi chỉ muốn thay đổi hành vi của một trong những phụ thuộc giả lập cho thử nghiệm cụ thể của tôi. Các bài kiểm tra tiếp theo cũng sẽ áp dụng các chuyên môn của riêng họ cho sự phụ thuộc giả định.

+0

Phương thức 'GetTracer' có được thiết lập trong phương pháp thiết lập thử nghiệm của bạn không? –

+0

Không, nó được thiết lập trong một phương pháp thử nghiệm cụ thể. Đó là chuyên môn cụ thể của bài kiểm tra cho Mock nếu điều đó có ý nghĩa. –

+0

Tôi đã thử nghiệm này, và nó đã làm việc cho tôi. Tôi có thể thiết lập phương thức 'GetTracer' sau khi nhận được đối tượng từ' traceProviderMock', và nó trả về giá trị mong đợi. Bạn có chắc chắn rằng xác nhận của bạn được thiết lập chính xác không? Bạn có thể bước qua mã trong trình gỡ lỗi, nếu bạn chưa làm? –

Trả lời

14

Hành vi này thực sự hoạt động như tôi mong đợi. Do một vấn đề với thử nghiệm của tôi, tôi đã không thực sự gọi phương pháp mới được chế nhạo. Điều này đánh lừa tôi tin rằng khung mocking không hoạt động.

Để tóm tắt, bạn có thể thay đổi mô hình sau khi .Object đã được gọi và thay đổi sẽ được phản ánh trong trường hợp đối tượng giả.

+0

Vấp ngã tự hỏi tại sao Moq không hành động đúng, cho đến khi đọc điều này, nhắc tôi thử một chiếc bánh khiêm tốn. Kiểm tra đối tượng phụ thuộc, và hóa ra nó không sử dụng Mock.Object như mong đợi ... lỗi của tôi. – Sully

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