gpt4 book ai didi

javascript - 如何将基于nodejs的单元测试转换为基于 native 浏览器的单元测试?

转载 作者:行者123 更新时间:2023-12-03 07:12:55 25 4
gpt4 key购买 nike

注意,相关How to test if jQuery 3.0 beta is Promises/A+ compatible in browser?

<小时/>

例如,位于 promises-tests其中一项测试位于 promises-tests/lib/tests/2.1.2.js

"use strict";

var assert = require("assert");
var testFulfilled = require("./helpers/testThreeCases").testFulfilled;

var adapter = global.adapter;
var deferred = adapter.deferred;

var dummy = { dummy: "dummy" }; // we fulfill or reject with this when we don't intend to test against it

describe("2.1.2.1: When fulfilled, a promise: must not transition to any other state.", function () {
testFulfilled(dummy, function (promise, done) {
var onFulfilledCalled = false;

promise.then(function onFulfilled() {
onFulfilledCalled = true;
}, function onRejected() {
assert.strictEqual(onFulfilledCalled, false);
done();
});

setTimeout(done, 100);
});

specify("trying to fulfill then immediately reject", function (done) {
var d = deferred();
var onFulfilledCalled = false;

d.promise.then(function onFulfilled() {
onFulfilledCalled = true;
}, function onRejected() {
assert.strictEqual(onFulfilledCalled, false);
done();
});

d.resolve(dummy);
d.reject(dummy);
setTimeout(done, 100);
});

specify("trying to fulfill then reject, delayed", function (done) {
var d = deferred();
var onFulfilledCalled = false;

d.promise.then(function onFulfilled() {
onFulfilledCalled = true;
}, function onRejected() {
assert.strictEqual(onFulfilledCalled, false);
done();
});

setTimeout(function () {
d.resolve(dummy);
d.reject(dummy);
}, 50);
setTimeout(done, 100);
});

specify("trying to fulfill immediately then reject delayed", function (done) {
var d = deferred();
var onFulfilledCalled = false;

d.promise.then(function onFulfilled() {
onFulfilledCalled = true;
}, function onRejected() {
assert.strictEqual(onFulfilledCalled, false);
done();
});

d.resolve(dummy);
setTimeout(function () {
d.reject(dummy);
}, 50);
setTimeout(done, 100);
});
});

要求:

能够在浏览器中运行测试而不依赖 node.js 、服务器或安装库?

问题:

如何将此测试转换为使用浏览器上可用的 native 方法的版本,例如 Console方法;也就是说,用 console.assert()window 上可用的其他本​​机方法替换 describe()specify()?

最佳答案

我仍然认为这是一个糟糕的主意,但这是一个(微不足道的)示例:

var assert = {};
assert.equals = function(expected, value, msg) {
var message = msg || "Test ";
try {
expected == value;
console.log(message, "passed");
catch (e) {
console.log(message, "failed", e);
}
};

现在重复 >, <, ===,范围、预期异常、特定异常(例如 TypeError、SyntaxError)、typeof , instanceof 、其他类型(内置、构造)、有问题的值,如 NaNnull

注:console.assert

console.assert 有一些问题。首先,它是非标准的,并且跨平台的行为可能不相同。其次,据我所知,没有好的方法来抽象它:您最终会使用 console.log 做与上述解决方案一样多的工作。除非您使用 eval 和字符串参数:

function assert(str, msg) {
try {
console.assert(eval(str), msg);
catch (e) {
console.log(msg, " failed:", e);
}
}

assert("3 === 4", "Three equals four"); // logs the assertion failure.

不用说,我不建议这样做,因为手动构建字符串很容易出错,eval (即使在这种情况下是安全的)是一个臭名昭著的性能 killer ,并且不使用 eval意味着使用解析器,然后我们又回到了库位。

说真的,当你沿着这条路走下去时,你会想到越来越多的东西你想要在那里(参见我上面的列表),你会意识到你正在编写一个库,而你本来可以使用一个库。

更新

根据下面评论中的问题,许多测试库(例如 mocha、jasmine)使用如下格式:

wrapper('name of the thing being tested', function(done) {
innerWrapper('description of the test', function(done) {
assert(someAssertion);
});

innerWrapper('some other test for that function', function(done) {
assert(somethingElse);
someAsyncFunction().then(function(value) {
assert(somethingAboutValue);
done();
});
});
});

“wrapper”、“innerWrapper”和“assert”是通过在代码中包含测试库或运行命令(对于 cli)来添加的,即“mochatests.js”而不是“nodetests.js”。设置可能会或可能不会使用内部函数来指定子测试。 “Done”是回调的一个参数,可用于表示异步测试的结束。

QUnit 的 API 稍微简单一些,但也相差不远。

更新2

这些大部分都是相同事物的名称:包装测试条件以确保记录正确的消息、捕获异常或异步有机会完成的函数。断言测试要评估的实际条件。适配器引用意味着包装 jQuery 延迟构造函数以匹配规范中的 API。

关于javascript - 如何将基于nodejs的单元测试转换为基于 native 浏览器的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36556330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com