2012-07-02 37 views
0

我在我的控制器调用的Authentication类中有以下方法。我知道控制器本身可以调用SetAuthCookie,但我更喜欢额外的抽象。我该如何测试一个只调用FormsAuthentication.SetAuthCookie()的方法?

public void FormsAuthSignIn(string loginName, bool rememberMe = false) 
{ 
    FormsAuthentication.SetAuthCookie(loginName, rememberMe); 
} 

只是在对象浏览器看FormsAuthentication显示没有成员,我可以用它来看看这工作?我应该使用Authorize属性构建一个测试控制器,并在我的测试中调用一个方法吗?我应该在这里做什么?

回答

1

我相信唯一要做的是单元测试这里是SetAuthCookie被调用了正确的参数。你不需要测试FormsAuthentication的逻辑。

这可以通过在接口后面隐藏FormsAuthentication来实现,并为测试实现自己的存根,以便对方法进行计数。
任何嘲笑框架将帮助你完成这项任务,而鼹鼠/ Typemock隔离器等可以让你直接模拟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在正确的情况下被调用。

0

我同意@ seldary的答案,测试对静态方法的任何调用的一般方法是在你自己的类中抽象出该调用,并为此提供一个接口。

但是,如果你不想修改你的产品代码,还有另外一种方法(可以说不那么“纯”):一些模拟框架使用黑客来解决这种确切的情况,通过允许你调用静态方法。

看PowerMock例如:http://code.google.com/p/powermock/

这是一个教程使用它:http://www.michaelminella.com/testing/how-to-mock-static-methods.html

(PS:我说“少纯”作为Powermock正在玩的类加载器,有时不被认为是善于利用嘲笑,尤其是伦敦学派的嘲弄者)

相关问题