Я только начал использовать AutoFixture.AutoMoq в своих модульных тестах, и я нахожу его очень полезным для создания объектов, где меня не интересует конкретное значение. В конце концов, анонимное создание объекта - вот что это такое.
То, с чем я борюсь, - это когда я забочусь о одном или нескольких параметрах конструктора. Возьмите ExampleComponent
ниже:
public class ExampleComponent
{
public ExampleComponent(IService service, string someValue)
{
}
}
Я хочу написать тест, где я поставлю определенное значение для someValue
, но оставьте IService
автоматически созданным AutoFixture.AutoMoq.
Я знаю, как использовать Freeze
на моем IFixture
, чтобы сохранить известное значение, которое будет вложено в компонент, но я не могу понять, как указать известное значение.
Вот что мне хотелось бы в идеале:
[TestMethod]
public void Create_ExampleComponent_With_Known_SomeValue()
{
// create a fixture that supports automocking
IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());
// supply a known value for someValue (this method doesn't exist)
string knownValue = fixture.Freeze<string>("My known value");
// create an ExampleComponent with my known value injected
// but without bothering about the IService parameter
ExampleComponent component = this.fixture.Create<ExampleComponent>();
// exercise component knowning it has my known value injected
...
}
Я знаю, что могу сделать это, вызвав конструктор напрямую, но это уже не будет анонимным созданием объекта. Есть ли способ использовать AutoFixture.AutoMock, как это, или мне нужно включить контейнер DI в мои тесты, чтобы иметь возможность делать то, что я хочу?
EDIT:
Я, вероятно, должен был быть менее абсурдным в моем первоначальном вопросе, поэтому вот мой конкретный сценарий.
У меня есть интерфейс ICache
, который имеет общие методы TryRead<T>
и Write<T>
:
public interface ICache
{
bool TryRead<T>(string key, out T value);
void Write<T>(string key, T value);
// other methods not shown...
}
Я реализую CookieCache
, где ITypeConverter
обрабатывает преобразование объектов в строки и из строк, а lifespan
используется для установки даты истечения срока действия файла cookie.
public class CookieCache : ICache
{
public CookieCache(ITypeConverter converter, TimeSpan lifespan)
{
// usual storing of parameters
}
public bool TryRead<T>(string key, out T result)
{
// read the cookie value as string and convert it to the target type
}
public void Write<T>(string key, T value)
{
// write the value to a cookie, converted to a string
// set the expiry date of the cookie using the lifespan
}
// other methods not shown...
}
Поэтому, когда вы пишете тест на дату истечения срока действия cookie, я забочусь о продолжительности жизни, но не о конвертере.