在qUnit中测试整页重定向

hay*_*uhl 7 testing jquery unit-testing mocking qunit

我有以下功能

var redirect = function() {
    window.location.href = "http://www.google.com";
}
Run Code Online (Sandbox Code Playgroud)

我想用qUnit测试这个函数.

问题是,当我调用运行测试的HTML文档时,一旦进入调用测试,redirect()浏览器就会加载google.com.我想做的是以某种方式模拟window.location.href,以便它不重定向,因此我可以检查它是否设置为正确的值.

以一种更可测试的方式重写它将是一个可接受的答案,并受到欢迎.由于我使用的是qUnit,因此一些jQuery魔法是合适的,就像一些老式的重构一样.建议为window.location.href添加自定义setter,但我无法弄清楚如何使其工作.

请不要改变我的代码行为的建议.

Mil*_*bir 2

如果不重新加载页面,则无法修改 window.location.href。但如果您绝对想测试这些类型的功能,则需要进行一些逻辑修改。

示例#1:

您可以使用两个函数来完成此操作,一个可以是类似于您的简单的redirectTo函数,另一个可以是具有构建和url逻辑的函数。像这样:

// this function is so simple that you never need to unit test it
var redirectTo = function(url)
{
    window.location.href = url;
}

// if this function has any logic worth testing you can do that without redirects
var buildUrl = function(someParameters)
{
    // ....
    // here be some logic...
    // ....

    return "http://www.google.com";
}
Run Code Online (Sandbox Code Playgroud)
  1. redirectTo(url) 函数非常简单,无需测试您就知道它可以正常工作。
  2. buildUrl(someParameters) 函数可以包含构建 URL 的逻辑,您应该对此进行测试。您可以在不进行页面重定向的情况下进行测试。

示例#2:

您还可以编写这两者之间的交叉:

// don't test this function as it will redirect
var redirect = function()
{
    window.location.href = buildUrl();
}

// if this function has any logic worth testing you can do that without redirects
var buildUrl = function()
{
    // ....
    // here be some logic...
    // ....

    return "http://www.google.com";
}
Run Code Online (Sandbox Code Playgroud)

上面的示例将具有与原始函数类似的形式,但具有您可以实际测试的 URL 构建逻辑函数。

不是一个例子,而是#3:

另一方面,如果你不想改变你的逻辑并且你有一个像这样简单的函数,那么如果你不测试它也没什么大不了的......