Tôi nghĩ rằng đây sẽ là một ví dụ trong đó tiêm phụ thuộc có thể hữu ích.
Điều đang xảy ra ở đây là bạn muốn kiểm tra xem một đối tượng bên trong (từ điển _values
) đã được cập nhật chính xác chưa bằng một cuộc gọi đến AddValue
.Bạn có thể đạt được điều này bằng cách tiêm một từ điển giả vào bài kiểm tra của bạn.
Điều này có thể được thực hiện, ví dụ: như sau. Trước tiên, bạn sẽ phải thay đổi lớp Sample
của bạn một chút:
public class Sample
{
private IDictionary<string, string> _values = new Dictionary<string, string>();
protected virtual IDictionary<string, string> GetDictionary()
{
return this._values;
}
public void AddValue(string key, string value)
{
GetDictionary().Add(key, value);
// ^^^
// notice this!
}
}
này bây giờ cho phép bạn thay thế các từ điển mặc định với nhau (mà bạn có thể quan sát trong thiết lập thử nghiệm của bạn) bằng cách bắt nguồn từ lớp Sample
của bạn và tiêm một cuốn từ điển mock bằng cách ghi đè các phương pháp InitializeDictionary
:
// this derived class is only needed in your test project:
internal class SampleTest : Sample
{
public SampleTest(IDictionary<string, string> dictionaryToUse)
{
this._dictionaryToUse = dictionaryToUse;
}
private IDictionary<string, string> _dictionaryToUse;
protected override IDictionary<string, string> GetDictionary()
{
return this._dictionaryToUse;
}
}
trong thiết lập thử nghiệm của bạn, bạn có thể kiểm tra tại lớp SampleTest
này thay vì lớp Sample
của bạn. Điều này nên được OK vì lớp dẫn xuất là giống hệt nhau ngoại trừ mà nó cho phép bạn chỉ định từ điển mà nó sẽ sử dụng trong nội bộ. Một thử nghiệm đơn vị để kiểm tra AddValue
bây giờ có thể trông như thế này:
[Test]
public void AddValue_addSomething_DictionaryHasOneAdditionalEntry()
{
var mockDictionary = new Dictionary<string, string>();
var sample = new SampleTest(mockDictionary);
var oldCount = mockDictionary.Count;
sample.AddValue(...);
Assert.AreEqual(oldCount + 1, mockDictionary.Count);
}
Disclaimer: Tôi không phải là một chuyên gia về kiểm tra đơn vị, vì vậy ví dụ của tôi có thể có những thiếu sót hoặc thậm chí là cách quá phức tạp . Ý định của tôi chỉ đơn thuần là chứng minh rằng bạn có thể kiểm tra các thuộc tính nội bộ của một lớp nếu bạn thiết kế lớp của mình theo cách có thể kiểm tra hợp lý - ví dụ: bằng cách cho phép các phương tiện tiêm phụ thuộc.
Ví dụ này "khác" như thế nào? Lớp học cung cấp những chức năng nào mà bạn cần kiểm tra? –
@Rex Tôi không chắc chắn nó là khác nhau, tôi nghĩ rằng nó "có vẻ" khác nhau. Trong trường hợp này, phần tử bên trong chỉ đơn giản là một vùng lưu trữ. Tôi muốn kiểm tra các phương thức công cộng đang hoạt động chính xác, tuy nhiên cách duy nhất để làm điều này là kiểm tra trường riêng. (lớp thực sự sẽ có logic phức tạp hơn trong phương pháp AddValue) – WDuffy