0

我的Authentication类中有以下由控制器调用的方法。我知道控制器可以调用SetAuthCookie自身,但我更喜欢额外的抽象。

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

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

4

2 回答 2

1

我相信这里唯一要进行单元测试的是SetAuthCookie使用正确的参数调用的。你不需要 testFormsAuthentication的逻辑。

这可以通过隐藏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在正确的情况下调用。

于 2012-07-02T15:49:31.450 回答
0

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

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

以 PowerMock 为例:http ://code.google.com/p/powermock/

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

(PS:我说“不那么纯粹”,因为 Powermock 正在使用类加载器,有时不被认为是对模拟的良好使用,尤其是伦敦的模拟者学校)

于 2012-07-03T08:42:00.723 回答