我在这个问题上搜索了很多,但找不到解决方案。
我正在试图模拟我的后端,经过充分测试,所以我可以完全隔离我的前端。我尝试过使用protractor-http-mock以及角度模拟的各种努力。
用HttpBackend解决了角度模拟方法,我在开始量角器测试时遇到了这个错误:
MBP:test-site admin$ protractor protractor.conf.js
Using ChromeDriver directly...
[launcher] Running 1 instances of WebDriver
[launcher] Error: ReferenceError: window is not defined
at Object.<anonymous> (/Users/Ed/Sites/F4F/web/node_modules/angular/angular.js:30426:4)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Module.require (module.js:367:17)
at require (internal/module.js:16:19)
at Object.<anonymous> (/Users/Ed/Sites/F4F/web/node_modules/angular/index.js:1:1)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
[launcher] Process exited with error code 100
这是我的protractor.conf.js
exports.config = {
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
chromeOnly: true,
chromeDriver: './node_modules/protractor/selenium/chromedriver',
// Framework to use. Jasmine 2 is recommended.
framework: 'jasmine2',
baseUrl: 'http://localhost:5000/',
seleniumAddress: 'http://127.0.0.1:4444/wd/hub',
// Spec patterns are relative to the current working directly when
// protractor is called.
specs: ['./tests/**/*.js'],
// Options to be passed to Jasmine.
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000
}
};
这是我的考验:
'use strict'
var angular = require('angular');
var angular_mock = require('angular-mocks');
var HttpBackend = require('httpbackend');
var backend = null;
describe("Footer", function () {
beforeEach(function() {
backend = new HttpBackend(browser);
});
afterEach(function() {
backend.clear();
});
describe("Display Values", function () {
it("should show correct contact details", function () {
backend.whenGET(/app/).respond({
"name": "ExampleApp",
"company": {
"code": "EXA",
"name": "ExampleApp",
"brand_name": "ExampleApp",
"head_office_id": 3,
"display_email": "sales@example.com",
"display_tel": "+44 (0) 1234 56789"
}
});
browser.get('/');
var tel_li = $('#footer .top li:first-child');
var email_li = $('#footer .top li:last-child');
expect(tel_li.getText()).toEqual('+44 (0) 1234 56789');
expect(email_li.getText()).toEqual('sales@example.com');
});
});
});
有人可以帮忙吗?
---回应@ alecxe的评论
修改测试看起来像这样:
'use strict'
describe("Footer", function () {
describe("Display Values", function () {
it("should show correct contact details", function () {
browser.get('/');
});
});
});
给出以下结果:
MBP:test-site admin$ protractor protractor.conf.js
Using ChromeDriver directly...
[launcher] Running 1 instances of WebDriver
Started
.
1 spec, 0 failures
Finished in 0.749 seconds
[launcher] 0 instance(s) of WebDriver still running
[launcher] chrome #1 passed
答案 0 :(得分:1)
根本不要导入angular-mocks
和angular
,httpbackend
不需要导入它们:
'use strict'
var HttpBackend = require('httpbackend');
var backend = null;
describe("Footer", function () {
beforeEach(function() {
backend = new HttpBackend(browser);
});
afterEach(function() {
backend.clear();
});
describe("Display Values", function () {
it("should show correct contact details", function () {
backend.whenGET(/app/).respond({
"name": "ExampleApp",
"company": {
"code": "EXA",
"name": "ExampleApp",
"brand_name": "ExampleApp",
"head_office_id": 3,
"display_email": "sales@example.com",
"display_tel": "+44 (0) 1234 56789"
}
});
browser.get('/');
var tel_li = $('#footer .top li:first-child');
var email_li = $('#footer .top li:last-child');
expect(tel_li.getText()).toEqual('+44 (0) 1234 56789');
expect(email_li.getText()).toEqual('sales@example.com');
});
});
});
答案 1 :(得分:1)
我遇到了您的确切问题,最后通过导入angular-mocks
作为原始字符串并通过browser.addMockModule
注入来解决问题:
const fs = require('fs');
const ngMock = fs.readFileSync(__dirname + '/../../node_modules/angular-mocks/angular-mocks.js', 'utf-8');
browser.addMockModule('ngMockE2E', ngMock);
browser.addMockModule('e2e', function e2e() {
angular.module('e2e', ['ngMockE2E'])
.run(['$httpBackend', function($httpBackend) {
// Your mocked calls here
}])
});
这将强制驱动程序在运行时编译脚本,其中window
可用。但是,如果您有browser.ignoreSynchronization = true;
,则会中断。