我的Authentication
类中有以下方法由我的控制器调用。我知道控制器可以调用SetAuthCookie
本身,但我更喜欢额外的抽象。
public void FormsAuthSignIn(string loginName, bool rememberMe = false)
{
FormsAuthentication.SetAuthCookie(loginName, rememberMe);
}
只是在对象浏览器中查看FormsAuthentication
,就会发现没有可以使用的成员来查看这是否有效?我应该使用Authorize
属性构建一个测试控制器,并在我的测试中调用一个方法吗?我该怎么办?
答案 0 :(得分:1)
我认为这里唯一要进行单元测试的是使用正确的参数调用SetAuthCookie
。您不需要测试FormsAuthentication
的逻辑。
这可以通过将FormsAuthentication
隐藏在接口后面,并为测试实现自己的存根来实现,这将计算对方法的调用。
任何模拟框架都可以帮助您完成此任务,而Moles / Typemock Isolator等将允许您直接模拟SetAuthCookie
。
除此之外,恕我直言,在这种情况下:
public class MyClass
{
public int Foo()
{
return Bar();
}
private int Bar()
{
return BarInner();
}
private int BarInner()
{
return BarInnerer();
}
private int BarInnerer()
{
return 42;
}
}
只有Foo
才能接受测试 - 所有其他方法都是实施细节。
与本案例相同 - 应该对FormsAuthSignIn
的调用者进行测试,该调用断言在正确的情况下调用FormsAuthSignIn
。
答案 1 :(得分:0)
我同意@seldary的回答,测试对静态方法的任何调用的一般方法是在你自己的类中抽象出该调用,并有一个接口。
但是如果你不想修改你的生产代码,还有另一种方式(可以说不那么“纯粹”):一些模拟框架通过允许你模拟对静态方法的调用来使用黑客来解决这个问题。 / p>
例如,请查看PowerMock:http://code.google.com/p/powermock/
这是一个使用它的教程:http://www.michaelminella.com/testing/how-to-mock-static-methods.html
(PS:我说“不那么纯粹”,因为Powermock正在使用类加载器,有时不被认为是嘲弄的好用,特别是伦敦的嘲笑学家)