我有一个使用Karma + Jasmine进行测试的AngularJS应用程序.我有一个我想要测试的函数,它接受一个大型JSON对象,将其转换为应用程序其余部分更易使用的格式,并返回该转换后的对象.而已.
对于我的测试,我希望你有单独的JSON文件(*.json)只有模拟JSON内容 - 没有脚本.对于测试,我希望能够加载JSON文件并将对象泵入我正在测试的函数中.
我知道我可以在这里描述的模拟工厂中嵌入JSON:http://dailyjs.com/2013/05/16/angularjs-5/但我真的希望JSON不包含在脚本中 - 只需直接JSON文件.
我尝试了一些东西,但我在这方面相当不错.首先,我设置我的Karma以包含我的JSON文件,看看它会做什么:
files = [
...
'mock-data/**/*.json'
...
]
Run Code Online (Sandbox Code Playgroud)
这导致:
Chrome 27.0 (Mac) ERROR
Uncaught SyntaxError: Unexpected token :
at /Users/aaron/p4workspace4/depot/sitecatalyst/branches/anomaly_detection/client/anomaly-detection/mock-data/two-metrics-with-anomalies.json:2
Run Code Online (Sandbox Code Playgroud)
所以我把它改成只提供文件而不是"包含"它们:
files = [
...
{ pattern: 'mock-data/**/*.json', included: false }
...
]
Run Code Online (Sandbox Code Playgroud)
既然他们只是服务,我想我会尝试在我的规范中使用$ http加载文件:
$http('mock-data/two-metrics-with-anomalies.json')
Run Code Online (Sandbox Code Playgroud)
当我运行我收到的规范时:
Error: Unexpected request: GET mock-data/two-metrics-with-anomalies.json
Run Code Online (Sandbox Code Playgroud)
在我的理解中意味着它期望来自$ httpBackend的模拟响应.所以...在这一点上我不知道如何使用Angular实用程序加载文件,所以我想我会尝试jQuery,看看我是否至少可以让它工作:
$.getJSON('mock-data/two-metrics-with-anomalies.json').done(function(data) {
console.log(data);
}).fail(function(response) {
console.log(response);
});
Run Code Online (Sandbox Code Playgroud)
这导致:
Chrome 27.0 (Mac) LOG: { readyState: 4,
responseText: 'NOT FOUND',
status: 404,
statusText: 'Not Found' …Run Code Online (Sandbox Code Playgroud) 我在单独的.js文件中为前端后端环境编写了这个小代码.myfile.json每当有一个ajax调用时我都需要得到/somelink.
angular.module('myApp')
.config(function($provide) {
$provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
})
.run(function($httpBackend, $http) {
$httpBackend.whenGET('/somelink').respond(function(method, url, data) {
$http({method: 'GET', url: '/somelink/myfile.json'})
.success(function(data, status, headers, config) {
return data;
})
.error(function(data, status, headers, config) {
});
});
});
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用并且给了我错误:
Error: Unexpected request: GET /somelink/myfile.json
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
请注意,我不想直接调用$ http来获取代码中的.json文件,因为这会丢弃生产代码.这样做的目的是将此代码分别保留在后端开发中.
谢谢.
更新1:
我补充说:
$rootScope.$apply();
$httpBackend.flush();
Run Code Online (Sandbox Code Playgroud)
现在我还有另外一个错误: Uncaught Error: No pending request to flush !
更新2:
玩完之后,我发现了一个小黑客.我把它放在.run()所有其他$ httpBackend模拟之前.此.js文件也必须放在所有控制器/服务/指令之前和app.js引导程序之后.
var data;
$.ajax({
type: 'GET',
async: false,
url: '/somelink/myfile.json'
}).success(function(res) {
data …Run Code Online (Sandbox Code Playgroud) 如何在Jasmine和Protractor中使用Mock HTTP?
在我的test.spec.js中,我声明了一个模拟,但这个模拟不起作用.我没有任何错误.我的api总是回应,而不是模拟.
我从未见过'mockModule!' 在我的控制台中.我的功能永远不会执行:
browser.addMockModule('modName', function() {
browser.executeScript(function() {console.log('mockModule!')});
angular.module('modName', []).value('foo', 'bar').run(function ($httpBackend) {
$httpBackend.whenPOST('http://api.webapp.net/app_dev.php/module/search?direction=asc&page=1').respond('repsond');
browser.executeScript(function() {console.log('enter mockModule!')});
});
});
Run Code Online (Sandbox Code Playgroud)
在我的app.js中,我没有"ngMock".
我在index.html中添加了这个:
node_modules/angular-mocks/angular-mocks.js
Run Code Online (Sandbox Code Playgroud)
我使用'gulp protractor-local'从命令提示符运行测试:
gulp.task('protractor-local', shell.task([
'protractor protractor.conf.js --baseUrl="http://mywebapp.local.net"'
]));
Run Code Online (Sandbox Code Playgroud)
所有测试都没问题,但不是模拟.
test.spec.js
var loginPO = new(require('./models/login.model.js'))();
describe("hello", function() {
it("I click on the button-search button", function() {
loginPO.wait(10);
//browser.ignoreSynchronization = false;
browser.addMockModule('modName', function() {
browser.executeScript(function() {console.log('mockModule!')});
angular.module('modName', []).value('foo', 'bar').run(function ($httpBackend) {
$httpBackend.whenPOST('http://api.webapp.net/app_dev.php/module/search?direction=asc&page=1').respond('repsond');
browser.executeScript(function() {console.log('enter mockModule!')});
});
});
//browser.getRegisteredMockModules();
loginPO.clickButtonSearchButton();
loginPO.wait(10);
});
it("I am on the home …Run Code Online (Sandbox Code Playgroud) angularjs ×3
javascript ×2
ajax ×1
angular-mock ×1
jasmine ×1
json ×1
karma-runner ×1
protractor ×1