【问题标题】:Use of conditional statements in Jasmine tests在 Jasmine 测试中使用条件语句
【发布时间】:2014-03-25 21:47:17
【问题描述】:

我有两个要测试的函数;一种仅在“现代浏览器”中运行,另一种仅在“旧”浏览器中运行。

我使用 Jasmine 作为我的测试框架和 Karma 来运行我的测试。 Karma 将启动许多运行所有测试的浏览器。

我的问题是在所有浏览器中测试我的所有功能会导致一些测试失败。例如,测试一个只能在现代浏览器中运行的函数在 IE8 中测试时会失败。

要测试的代码:

function getStuffFromSmartBrowser() {
    return 'foo';
}

function getStuffFromNotSoSmartBrowser() {
    return 'bar';
}

if ('intelligence' in browser) {
    getStuffFromSmartBrowser();
} else {
    getStuffFromNotSoSmartBrowser();
}

原始测试代码:

describe("A suite", function () {
    it("for smart browsers", function () {
        expect(getStuffFromSmartBrowser()).toEqual('foo');
    });
});

describe("A suite", function () {
    it("for not so smart browsers", function () {
        expect(getStuffFromNotSoSmartBrowser()).toEqual('bar');
    });
});

在这些测试用例中,一个测试在一种类型的浏览器中会失败,而另一个测试在另一种类型的浏览器中会失败。

替代测试代码:

describe("A suite", function () {
    if ('intelligence' in browser) {
        it("for smart browsers", function () {
            expect(getStuffFromSmartBrowser()).toEqual('foo');
        });
    } else {
        it("for not so smart browsers", function () {
            expect(getStuffFromNotSoSmartBrowser()).toEqual('bar');
        });
    }
});

替代测试代码在所有经过测试的浏览器中运行良好。

问题:

A - 在测试中使用条件语句是一种好习惯吗?

B - 如果不是,什么是更好的方法?

【问题讨论】:

  • 在你的测试中有条件是不好的。测试中的分支通常被认为是代码异味。你最好断言browser == LegacyBrowser || realTestCondition之类的东西。如果测试不应该在旧版浏览器上运行,这将导致短路。

标签: javascript testing jasmine


【解决方案1】:

通常认为在测试代码中包含条件是不好的做法。测试代码之外的代码更容易接受,并且在没有内置机制通过浏览器选择测试规范的情况下,您的解决方案可能是最简单的。但是,您将单元测试与特定于浏览器的实现耦合在一起。

“更好”的方法是将浏览器特定代码隐藏在单个函数后面,并使用特征检测来执行multiple dispatch

function getStuff() {
    if (browserIsSmart()) {
        return getStuffFromSmartBrowser();
    }
    else {
        return getStuffFromNotSoSmartBrowser();
    }
}

function browserIsSmart() {
    return ('intelligence' in browser);  // Or whatever
}

这就是它变得混乱的地方。您的两个函数具有不同的返回值。理想情况下,您希望所有相关函数都具有相同的返回值,但这并不总是那么简单。例如,IE8 中的 textarea 选择使用与现代浏览器中的 textarea 选择完全不同的对象。有时您可以隐藏详细信息(例如使用Strategy Pattern),有时则不能。

如果你不能让它干净,那就让它显而易见。

【讨论】:

  • 我给了你一个 +1 评价“如果你不能让它变得干净,那就让它变得明显。” :)
猜你喜欢
  • 2023-03-25
  • 2023-03-13
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多