Я думаю, что это будет примером, где внедрение зависимостей может помочь.
Здесь происходит то, что вы хотите проверить, правильно ли обновлен внутренний объект (словарь _values
) при вызове AddValue
. Вы можете добиться этого, вставив в тестовый класс фиктивный словарь.
Это можно сделать, например, следующее. Во-первых, вам нужно немного изменить свой класс Sample
:
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!
}
}
Теперь это позволяет вам заменить словарь по умолчанию другим (который вы можете наблюдать в настройках теста), производным от вашего класса Sample
и введением фиктивного словаря путем переопределения метода 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;
}
}
В вашей тестовой настройке вы можете теперь протестировать этот класс SampleTest
вместо вашего Sample
класса. Это должно быть в порядке, поскольку производный класс идентичен , за исключением , что позволяет указать словарь, который он будет использовать внутри. Модульный тест для проверки AddValue
теперь может выглядеть так:
[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);
}
Отказ от ответственности: Я ни в коем случае не эксперт по юнит-тестированию, поэтому мой пример может быть ошибочным или даже слишком сложным. Мое намерение состояло в том, чтобы просто продемонстрировать, что вы можете проверить внутренние свойства класса, если вы разрабатываете свой класс достаточно проверяемым способом, например разрешая средства внедрения зависимости.