Я только что начал использовать AutoFixture.AutoMoq в своих модульных тестах, и я нахожу его очень полезным для создания объектов, где мне все равно, стоимость. В конце концов, анонимное создание объекта - вот что это такое.AutoFixture.AutoMoq дает известное значение для одного параметра конструктора
То, с чем я борюсь, - это когда я забочусь о одном или нескольких параметрах конструктора. Возьмите ниже:
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
используется для установки даты истечения срока действия печенье.
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...
}
Так при написании теста на дату истечения срока действия куки, я забочусь о продолжительности жизни, но не так много о преобразователе.
Зачем вы хотите это сделать? Что такое сценарий? IME, подобные сценарии пахнут, как смешанные проблемы в «ExampleComponent». Есть причина, по которой AutoFixture не поддерживает это из коробки. –
@MarkSeemann, что вы думаете о моем сценарии в отредактированном вопросе? Я не думаю, что это можно интерпретировать как смешанные проблемы. –
Ну, мне довольно сложно сказать, потому что я не вижу, как вы собираетесь использовать «продолжительность жизни». Разве «продолжительность жизни» не должна взаимодействовать с текущим временем? Когда вы начнете думать о таких вопросах, как, возможно, абстракция все еще возникает. В прошлый раз, когда я сделал что-то подобное, я пришел вместо интерфейса ILease, что сделало логику кеша более гибкой, поскольку теперь я могу поддерживать: Абсолютный срок действия, Раздвижные окна, истечение срока действия LRU и множество других опций. –