Đây là lần đầu tiên tôi làm bài kiểm tra đơn vị, vì vậy hãy kiên nhẫn với tôi.
I'm still trying to unit test a library that converts lists of POCOs to ADO.Recordsets. Ngay bây giờ, tôi đang cố gắng viết một bài kiểm tra tạo ra List<Poco>
, chuyển đổi nó thành Recordset (sử dụng phương pháp tôi muốn kiểm tra) và sau đó kiểm tra xem chúng có chứa cùng thông tin (như, nếu Poco.Foo == RS.Foo
và Sớm...).Làm cách nào để tránh nhiều lần khẳng định trong thử nghiệm đơn vị này?
Đây là POCO:
public class TestPoco
{
public string StringValue { get; set; }
public int Int32Value { get; set; }
public bool BoolValue { get; set; }
}
... và đây là thử nghiệm cho đến nay (Tôi đang sử dụng xUnit.net):
[Fact]
public void TheTest()
{
var input = new List<TestPoco>();
input.Add(new TestPoco { BoolValue = true, Int32Value = 1, StringValue = "foo" });
var actual = input.ToRecordset();
Assert.Equal(actual.BoolValue, true);
Assert.Equal(actual.Int32Value, 1);
Assert.Equal(actual.StringValue, "foo");
}
Những gì tôi không thích về đây là ba sự khẳng định ở cuối, mỗi một thuộc tính của POCO.
Tôi đã đọc rất nhiều lần rằng nhiều xác nhận trong một thử nghiệm là điều xấu (và tôi hiểu lý do tại sao và tôi đồng ý).
Vấn đề là, làm thế nào tôi có thể loại bỏ chúng?
Tôi có cuốn sách tuyệt vời Roy Osherove của "The Art of Unit Testing" ngay trước mặt tôi, và anh ta có một ví dụ trong đó bao gồm chính xác này (đối với những người có cuốn sách: Chương 7.2.6, trang 202/203):
Trong ví dụ của mình, phương thức được thử trả về một đối tượng AnalyzedOutput
với một số thuộc tính và anh ta muốn khẳng định tất cả các thuộc tính để kiểm tra xem mỗi thuộc tính có chứa giá trị mong đợi hay không.
Giải pháp trong trường hợp này:
Tạo một AnalyzedOutput
dụ, điền vào nó với các giá trị mong đợi và khẳng định nếu nó tương đương với một trả về bởi phương pháp thử (và ghi đè Equals()
để có thể làm được điều này).
Nhưng tôi nghĩ rằng tôi không thể làm điều này trong trường hợp của tôi, bởi vì phương pháp mà tôi muốn thử nghiệm trả về một ADODB.Recordset
.
Và để tạo một Recordset
với các giá trị dự kiến, đầu tiên tôi sẽ cần phải tạo ra nó hoàn toàn từ đầu:
// this probably doesn't actually compile, the actual conversion method
// doesn't exist yet and this is just to show the idea
var expected = new ADODB.RecordsetClass();
expected.Fields.Append("BoolValue", ADODB.DataTypeEnum.adBoolean);
expected.Fields.Append("Int32Value", ADODB.DataTypeEnum.adInteger);
expected.Fields.Append("StringValue", ADODB.DataTypeEnum.adVarWChar);
expected.AddNew();
expected.BoolValue = true;
expected.Int32Value = 1;
expected.StringValue = "foo";
expected.Update();
Tôi không thích điều này một trong hai, bởi vì đây là cơ bản là một sự trùng lặp của một số của các mã trong phương pháp chuyển đổi thực tế (phương pháp được thử nghiệm), đó là một điều khác để tránh trong các thử nghiệm.
Vì vậy, tôi có thể làm gì bây giờ?
Mức độ trùng lặp này vẫn có thể chấp nhận được trong tình huống đặc biệt này hay không hoặc có cách nào tốt hơn để kiểm tra điều này không?
đó là lý do tại sao "nghệ thuật" của thử nghiệm đơn vị chứ không phải "khoa học" ... – Berryl
Nhiều xác nhận trong một trường hợp thử nghiệm không phải là điều xấu. Ý tưởng cho rằng mỗi trường hợp thử nghiệm chỉ nên có một khẳng định [là ngu xuẩn] (http://stackoverflow.com/a/20300843/545127). – Raedwald