我刚刚开始在我的单元测试中使用AutoFixture.AutoMoq,我发现它对于创建我不关心特定值的对象非常有帮助。毕竟,匿名对象创建就是它的全部内容。
当我关心一个或多个构造函数参数时,我正在苦苦挣扎。采取ExampleComponent
以下措施:
public class ExampleComponent
{
public ExampleComponent(IService service, string someValue)
{
}
}
我想编写一个测试,其中我提供了一个特定的值,someValue
但由AutoFixture.AutoMoqIService
自动创建。
我知道如何使用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 容器合并到我的测试中才能做我想做的事情?
编辑:
在我最初的问题中,我可能应该不那么抽象,所以这是我的具体情况。
我有一个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
whereITypeConverter
处理对象与字符串之间的转换,并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 的到期日期编写测试时,我关心的是寿命,而不是转换器。