我是新手,我一直在寻找方法(或标准)来编写适当的功能测试,但我仍然有许多未解答的问题。我正在使用FrisbyJS为我的NodeJS API应用程序编写功能测试,并使用jasmine-node
来运行它们。
我已经阅读了弗里斯比的文档,但这对我来说并不富有成效。
以下是一个场景:
User
。 (显然不允许用户名重复)User
后,他可以登录。登录成功后,他获得了一个Access-Token。User
可以创建Post
。然后,Post
可以Comment
,依此类推...... User
。 (不是来自我的NodeJS应用程序)Frisby文档说的是,我应该在测试中编写测试。
例如(full-test.spec.js):
// Create User Test
frisby.create('Create a `User`')
.post('http://localhost/users', { ... }, {json: true})
.expectStatus(200)
.afterJSON(function (json) {
// User Login Test
frisby.create('Login `User`')
.post('http://localhost/users/login', { ... }, {json: true})
.expectStatus(200)
.afterJSON(function (json) {
// Another Test (For example, Create a post, and then comment)
})
.toss();
})
.toss();
这是编写功能测试的正确方法吗?我不这么认为......看起来很脏。
我希望我的测试是模块化的。每个测试的单独文件。
如果我为每个测试创建单独的文件,那么在为Create Post
编写测试时,我需要一个User
的访问令牌。
总而言之,问题是:如果事情相互依赖,我应该如何编写测试?
Comment
取决于Post
。 Post
取决于User
。
答案 0 :(得分:0)
这是使用NodeJS的副产品。这是我后悔决定弗里斯比的一个重要原因。那个以及我无法找到一个很好的方法来及时地从数据库中加载预期结果以便在测试中使用它们。
答案 1 :(得分:0)
据我了解 - 您基本上希望按顺序执行测试用例。一个接一个。
但由于这是javascript,因此frisby测试用例是异步的。因此,为了使它们同步,文档建议您嵌套测试用例。现在,对于几个测试用例来说,这可能是好的。但如果有数百个测试用例,嵌套就会变得混乱。
因此,我们使用sequenty - 另一个nodejs模块,它使用回调来按顺序执行函数(以及包含在这些函数中的测试用例)。在afterJSON块中,在所有断言之后,你必须做一个回调 - cb()[通过sequenty传递给你的函数]。
https://github.com/AndyShin/sequenty
var sequenty = require('sequenty');
function f1(cb){
frisby.create('Create a `User`')
.post('http://localhost/users', { ... }, {json: true})
.expectStatus(200)
.afterJSON(function (json) {
//Do some assertions
cb(); //call back at the end to signify you are OK to execute next test case
})
.toss();
}
function f2(cb){
// User Login Test
frisby.create('Login `User`')
.post('http://localhost/users/login', { ... }, {json: true})
.expectStatus(200)
.afterJSON(function (json) {
// Some assertions
cb();
})
.toss();
}
sequenty.run(f1,f2);