我正在使用NightmareJS和Mocha。一切似乎都运行良好,但我在分离测试时遇到问题,因为我的会话不会在不同的测试用例中持续存在。
第一个测试正在通过,但第二个测试Should be able to edit
失败,因为即使我使用分区选项,我也会在同一个登录页面上结束。我怎么能克服这个?
require('mocha-generators').install();
var Nightmare = require('nightmare');
var expect = require('chai').expect;
describe('Nightmare JS tests', function() {
this.timeout(30000);
var url = 'http://localhost/app/';
describe('base functionality', function() {
it('Should be able to login', function*() {
var nightmare = Nightmare({
show: true,
'webPreferences': {
partition: 'persist:somesession'
}
});
var result = yield nightmare
.goto(url)
.wait('.login')
.click('.login')
.wait('h4.heading')
.wait(1000)
.evaluate(function () {
return document.querySelector('h4.heading').innerHTML;
})
.end();
expect(result).to.equal("This is heading");
});
it('Should be able to edit', function*() {
var nightmare = Nightmare({
show: true,
'webPreferences': {
partition: 'persist:somesession'
}
})
var result = yield nightmare
.goto('http://localhost/app/company')
.wait("button.edit")
.click("button.edit")
.wait("input[type='text']")
.insert("input[type='text']", false)
.insert("input[type='text']", "This is some address")
.click("button[type='submit']")
.wait("div.success")
.evaluate(function () {
return document.querySelector("div.success").innerText;
})
.end()
expect(result).to.contain("Updated!");
});
});
});
答案 0 :(得分:5)
关于共享会话,关于Nightmare Github项目(有关更多信息,请参阅#430和#398)围绕此主题进行了一些讨论。 TL; DR版本是您可以重置会话,但跨实例使用相同的会话未经过充分测试。 (从你的例子来看,看起来你可能已经看过这些了。)
无论如何,我认为我可以帮助解决您当前的问题。两个建议:
before()
块,并使用相同的实例进行测试。然而,这引入了测试依赖性,并且通常被认为是不合需要的。beforeEach()
块。将整个登录单元测试移至beforeEach()
块,以便每次测试都获得全新登录。您还需要添加afterEach()
块来清理恶梦实例。这将使您的测试可以独立运行,但也会为运行整个单元测试电池带来大量的时间开销。基于您的样本的#2(未经测试)示例可能会有所帮助:
require('mocha-generators').install();
var Nightmare = require('nightmare');
var expect = require('chai').expect;
describe('Nightmare JS tests', function() {
this.timeout(30000);
var url = 'http://localhost/app/';
describe('base functionality', function() {
var nightmare;
beforeEach(function*() {
nightmare = Nightmare({
show: true,
});
yield nightmare
.goto(url)
.wait('.login')
.click('.login')
.wait('h4.heading')
.wait(1000)
});
afterEach(function*() {
yield nightmare.end();
});
it('Should be able to edit', function*() {
var result =
yield nightmare
.goto('http://localhost/app/company')
.wait("button.edit")
.click("button.edit")
.wait("input[type='text']")
.insert("input[type='text']", false)
.insert("input[type='text']", "This is some address")
.click("button[type='submit']")
.wait("div.success")
.evaluate(function() {
return document.querySelector("div.success").innerText;
});
expect(result).to.contain("Updated!");
});
});