2014-09-18 19 views
5

Tôi đã sử dụng Moq và yêu thích nó, nhưng tôi đã gặp một vấn đề chế nhạo một số mã cũ (trước khi tôi cố gắng tái cấu trúc nó đi)Tôi có thể sao chép triển khai Moq Mock không?

Điều tôi thực sự muốn làm là có hai mock riêng biệt, với chỉ thực hiện hơi khác nhau, chẳng hạn như mẫu bên dưới.

 Mock<IFoo> fooMock = new Mock<IFoo>(); 
     fooMock.SetupGet(f => f.bar).Returns(7); 
     fooMock.SetupGet(f => f.bar2).Returns(3); 
     Mock<IFoo> fooMockClone = new Mock<IFoo>(fooMock.Behavior); 
     fooMockClone.SetupGet(f => f.bar).Returns(9); 

     Debug.Assert(7 == fooMock.Object.bar); 
     Debug.Assert(9 == fooMockClone.Object.bar); 
     Debug.Assert(3 == fooMockClone.Object.bar2); 
     Debug.Assert(3 == fooMock.Object.bar2); 

Đây là ví dụ đơn giản nhưng mã thực là đối tượng có nhiều phương pháp và tôi muốn triển khai hơi khác nhau cho hai phiên bản.

Cảm ơn

+0

Câu hỏi của bạn có vẻ khó hiểu - bạn đã có một copy-paste "whoopsie" với các thiết lập fooMock thứ hai và sự khẳng định thứ hai? –

+0

Bạn hoàn toàn đúng. Tôi đã làm. Đã sửa. Cảm ơn :) –

+0

Chờ, bạn chỉ muốn một đối tượng giả có giá trị thay đổi mỗi khi bạn truy cập vào nó hay cái gì đó? –

Trả lời

1

Tôi tự hỏi trong trường hợp này, nếu bạn đang tìm kiếm các thử nghiệm Hành vi. Đây là một mẫu trong Machine.Fakes với lớp con Moq ... nó cho phép làm tổ nó có vẻ như bạn đang muốn, trong khi vẫn duy trì sự tách biệt hợp lý của các bài kiểm tra. Đòi hỏi gói NuGet: Machine.Fakes.Moq, Machine.Specifications.Should

class IFoo_test_context : WithSubject<IFoo> 
{ 
    Establish context =() => Subject.bar2 = 3; 
} 

class When_fooing_with_seven : IFoo_test_context 
{ 
    Establish context =() => Subject.bar = 7; 

    It bar_should_be_seven =()=> Subject.bar.ShouldEqual(7); 
    It bar2_should_be_three =()=> Subject.bar.ShouldEqual(3); 
} 

class When_fooing_with_nine : IFoo_test_context 
{ 
    Establish context =() => Subject.bar = 9; 

    It bar_should_be_nine =() => Subject.bar.ShouldEqual(9); 
    It bar2_should_be_three =() => Subject.bar.ShouldEqual(3); 
} 

Một lần nữa ví dụ này là hơi ngớ ngẩn vì nó kiểm tra các hành vi nhạo báng, nhưng thật khó để nhìn thấy những gì bạn đang cố gắng cuối cùng để hoàn thành. Không có nhà xây dựng bản sao theo cách bạn muốn với Mock như xa như tôi có thể nói.

+0

Tôi đã sao chép ví dụ của bạn, với sửa đổi của tôi và nó đã hoạt động trong Moq 4.2.1409.1722 từ NuGet kể từ 2014-09-18. –

+0

Tôi tin rằng fooMock.Behaviour chỉ trả về nếu giả được tạo ra với MockBehaviour.Strict, Loose hoặc Default (Tôi cập nhật ví dụ khủng khiếp của mình để hiển thị một chút rõ ràng hơn những gì tôi thực sự muốn. Xin lỗi ...) –

+0

Tôi đã cập nhật câu trả lời của mình dựa trên các chỉnh sửa của bạn đối với câu hỏi gốc. –

0

Bạn không thử các chi tiết triển khai, bạn giả định các giá trị để bạn có thể đến một điểm trong mã mà bạn cần kiểm tra. Không có điểm nào trong việc viết một bài kiểm tra để kiểm tra xem liệu một phụ thuộc giả lập có xuất ra một giá trị hay không, sau đó bạn chỉ thử nghiệm moq.

Ex:

public class Stuff { 
    IFoo _foo; 
    IBar _bar; 
    public Stuff(IFoo foo, IBar bar){ 
     _foo = foo; 
     _bar = bar; 
    } 
    public void DoStuff() { 
     if(_foo.HasFooage) { 
      _bar.Bar = 4; 
     } 
    } 
} 

Sau đó thử nghiệm của bạn sẽ:

... 
public void test_bar_does_bar() { 
    var foo = new Mock<IFoo>(); 
    foo.Setup(f => f.HasFooage).Returns(true); 
    var bar = new Mock<IBar>(); 
    var stuff = new Stuff(foo.Object, bar.Object); 

    stuff.DoStuff(); 

    Assert.That(bar.Bar, Is.EqualTo(4)); 
} 
+1

Tôi tin rằng bạn đã bỏ lỡ vấn đề. OP chỉ cố gắng giải quyết vấn đề xuống đến mức có thể đưa ra một câu trả lời ngắn. – Michael

+0

Hãy tự hỏi mình điều này: Điểm của việc thực hiện một debug.assert là liệu đối tượng giả của bạn có giá trị bạn đặt cụ thể để có nó trong đó ...? –

+0

Tôi muốn chuyển đối tượng đến một phương thức mà tôi đang thử nghiệm và kiểm tra xem giá trị đã được đặt là như mong đợi hay chưa. Sử dụng SetProperty có thể đã làm cho điều này rõ ràng hơn một chút mà nó sẽ được thiết lập sau này. Tôi phát hiện ra rằng ví dụ của tôi là khủng khiếp theo nhiều cách. –

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