我想是否有人尝试使用Grensesnitt作为unit-testing of classes that all follow the same interface。我有一个没有无参数构造函数的类的问题。我知道有GrensesnittObjectLocator
,但我无法弄清楚,如何使用它。
请指教,如何使用grensesnitt测试这些没有无参数构造函数的类。
答案 0 :(得分:0)
我无法让这个开箱即用。我不得不稍微调整一下。所以在GrensesnittObjectLocator.GetHandler
方法中而不是:
public static Func<object> GetHandler(Type T)
{
Func<object> handler;
if (handleAll != null) return () => { return handleAll(T); };
if (map.TryGetValue(T, out handler))
{
return (Func<object>)handler;
}
return () => { return TryReflections(T); };
}
我将其修改为:
public static Func<object> GetHandler(Type T)
{
return () =>
{
Func<object> handler;
if (handleAll != null) return handleAll(T);
if (map.TryGetValue(T, out handler))
{
return handler();
}
return TryReflections(T);
};
}
通过这个修改,我编写了以下例子:
public interface IFoo
{
int Add(int a, int b);
}
public class Foo : IFoo
{
private readonly string _foo;
public Foo(string foo)
{
_foo = foo;
}
public int Add(int a, int b)
{
return a + b;
}
}
您可以看到Foo
类没有默认构造函数。所以现在我们可以进行这个测试:
[InterfaceSpecification]
public class IFooTests : AppliesToAll<IFoo>
{
[Test]
public void can_add_two_numbers()
{
Assert.AreEqual(5, subject.Add(2, 3));
}
}
为了向grensesnitt
指示如何实例化Foo
,只需将以下类添加到测试程序集(包含先前单元测试的同一程序集):
[SetUpFixture]
public class Config
{
[SetUp]
public void SetUp()
{
// indicate to Grensesnitt that the Foo class
// doesn't have a default constructor and that
// it is up to you to provide an instance
GrensesnittObjectLocator.Register<Foo>(() =>
{
return new Foo("abc");
});
}
}