相关疑难解决方法(0)

在Karma + AngularJS测试中加载模拟JSON文件

我有一个使用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)

angularjs karma-runner

84
推荐指数
4
解决办法
7万
查看次数

使用Angular mock为Backendless开发加载JSON文件

我在单独的.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)

javascript ajax json angularjs angular-mock

9
推荐指数
2
解决办法
8039
查看次数

将Mock HTTP与Protractor和Jasmine一起使用

如何在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)

javascript jasmine angularjs angularjs-e2e protractor

5
推荐指数
1
解决办法
1378
查看次数