2013-03-04 14 views
9

Thử nghiệm này có sử dụng đúng cách AutoFixture và Moq không? Nó có được viết ngắn gọn nhất có thể không? Bài kiểm tra thất bại, như mong đợi, và vượt qua sau khi viết việc thực hiện chính xác.Thử nghiệm này có sử dụng đúng cách AutoFixture và Moq không?

[Fact] 
public void CustomerPropertyIsCorrect() 
{ 
    var fixture = new AutoMoqFixture(); 

    var expected = fixture.Create<CardHolderCustomer>(); 
    var builderMock = fixture 
     .Freeze<Mock<ICustomerAdapter>>() 
     .Setup(x => x.BuildCustomer()).Returns(expected); 

    var sut = fixture.Create<CardHolderViewModel>(); 
    var actual = sut.Customer; 

    Assert.Equal(expected, actual); 
} 

Trả lời

16

Có vẻ tốt! Tuy nhiên, bạn cũng có thể sử dụng nó declaratively với xUnit.net extension.

Giả sử rằng các loại được sử dụng trong các thử nghiệm được định nghĩa là:

public class CardHolderCustomer 
{ 
} 

public interface ICustomerAdapter 
{ 
    CardHolderCustomer BuildCustomer(); 
} 

public class CardHolderViewModel 
{ 
    private readonly ICustomerAdapter adapter; 

    public CardHolderViewModel(ICustomerAdapter adapter) 
    { 
     if (adapter == null) 
      throw new ArgumentNullException("adapter"); 
     this.adapter = adapter; 
    } 

    public CardHolderCustomer Customer 
    { 
     get 
     { 
      return this.adapter.BuildCustomer(); 
     } 
    } 
} 

Các thử nghiệm ban đầu có thể được viết như:

[Theory, DomainTestConventions] 
public void CustomerPropertyIsCorrect2(
    CardHolderCustomer expected, 
    [Frozen]Mock<ICustomerAdapter> builderStub, 
    CardHolderViewModel sut) 
{ 
    builderStub 
     .Setup(x => x.BuildCustomer()) 
     .Returns(expected); 

    var actual = sut.Customer; 

    Assert.Equal(expected, actual); 
} 

Các DomainTestConventionsAttribute được định nghĩa là:

internal class DomainTestConventionsAttribute : AutoDataAttribute 
{ 
    internal DomainTestConventionsAttribute() 
     :base(new Fixture().Customize(new DomainTestConventions())) 
    { 
    } 
} 

Các DomainTestConventions được định nghĩa là:

internal class DomainTestConventions : CompositeCustomization 
{ 
    internal DomainTestConventions() 
     :base(new AutoMoqCustomization()) 
    { 
    } 
} 

Lưu ý rằng DomainTestConventions xuất phát từ CompositeCustomization mà về cơ bản có nghĩa là bạn có thể tạo thêm tuỳ chỉnh và thêm chúng như tham số cho các nhà xây dựng cơ bản.

Bạn cũng có thể đọc:

Hy vọng rằng sẽ giúp.

+1

Cảm ơn bạn! Đó chính là phản hồi tôi đang tìm kiếm. – cocogorilla

+10

Tôi chỉ cần thêm ... thực tế bạn sao chép mã mù của tôi chứng minh tốt hơn bất kỳ cuốn sách nhanh nhẹn nào có thể kiểm tra là nguồn tài liệu chính cho mã. – cocogorilla

+0

+1 Chỉ là một câu trả lời tuyệt vời –

0

Tôi nghĩ điều này là ngắn gọn và dễ đọc. Nhưng tôi hỏi giá trị của loại thử nghiệm này.

Bài kiểm tra của bạn có tên CustomerPropertyIsCorrect, vì vậy tôi giả sử đây là những gì bạn muốn kiểm tra. Vì bạn hướng dẫn phương thức BuildCustomer của ICustomerAdapter để trả về cá thể đã được tạo trước đó và vì mã mô hình chế độ xem sẽ sử dụng mã này khi chạy trong xUnit, có, đối tượng cố định thực sự sẽ được trả về.

Bây giờ, tôi không phải là tất cả trong trại TDD (chưa) vì vậy đây có thể chỉ là tôi, chứ không phải "nhận" TDD. Nhưng theo như tôi có thể thấy, kiểm tra này sẽ xác minh rằng mô hình khung nhìn có một số ví dụ CardHolderCustomer trong thuộc tính Khách hàng của nó - nhưng không nhất thiết phải là "đúng". Giá trị đó ở đâu?