Testing 测试启动时执行ajax请求的angular应用程序

Testing 测试启动时执行ajax请求的angular应用程序,testing,angularjs,jasmine,karma-runner,Testing,Angularjs,Jasmine,Karma Runner,我需要我的angular应用程序的测试组件。问题是每次我想测试某个东西时,karma testrunner都会向我显示错误: Error: Unexpected request: GET /foo No more request expected 经过一些研究,很明显测试框架会阻止所有请求,我需要通过以下方式声明我的测试中接受的每个请求: beforeEach(inject(function ($httpBackend) { $httpBackend.expectGET("/foo")

我需要我的angular应用程序的测试组件。问题是每次我想测试某个东西时,karma testrunner都会向我显示错误:

Error: Unexpected request: GET /foo
No more request expected
经过一些研究,很明显测试框架会阻止所有请求,我需要通过以下方式声明我的测试中接受的每个请求:

beforeEach(inject(function ($httpBackend) {
    $httpBackend.expectGET("/foo").respond("bar");
}));
所以我可以对请求进行期望

问题在于,我似乎无法初始化$httpBackend并在此之后加载模块/应用程序,如下图所示:

beforeEach(inject(function ($httpBackend) {
    $httpBackend.expectGET("/foo").respond("bar");
}));
beforeEach(module('myApplication'));
它失败了

Error: Injector already created, can not register a module!
Error: Unexpected request: GET /foo
No more request expected
但是,要先加载我的模块/应用程序,然后配置$httpBackend,为时已晚:

beforeEach(module('myApplication'));
beforeEach(inject(function ($httpBackend) {
    $httpBackend.expectGET("/foo").respond("bar");
}));
失败于

Error: Injector already created, can not register a module!
Error: Unexpected request: GET /foo
No more request expected
它失败是因为我需要在我的应用程序配置
myapp.config(函数(…){..doSomeAjax..}


你知道如何解决这个问题吗?

关于第一个问题:你可以像这样加载你需要的模块:

var $httpBackend; // reference for your it() functions
beforeEach(function () {
    module('myApplication');

    inject(function ($injector) {
        $httpBackend = $injector.get('$httpBackend');
    });
});
现在,关于意外请求问题,来自:

生产中使用的$httpBackend始终以异步方式响应请求。如果我们在单元测试中保留此行为,我们将不得不创建异步单元测试,这很难编写、遵循和维护。同时,测试模拟无法同步响应,因为这将改变代码在因此,mock$httpBackend有一个flush()方法,该方法允许测试显式地刷新挂起的请求,从而保留后端的异步api,同时允许测试同步执行

我在使用它时与您有点不同,因此我下面的解决方案只是一个猜测。首先,我认为您需要一个模拟响应。您可以使用
when()…respond()
定义它。然后,您应该刷新您的请求:

$httpBackend.expectGET("/foo").respond("bar");
$httpBackend.flush();

我用它来测试工厂中发出http请求的服务。在beforeach子句中,我首先定义了模拟响应,然后实例化了服务(
myservice=$injector('nameofservice'))
然后我刷新了在工厂触发的请求。

我知道这一点,并且我喜欢这个功能。如果我以您的第一个代码为例,我的应用程序将是我当前开发的应用程序,它将在第3行(
模块('myApplication');
)中发出请求这将在我在第5-7行中创建$httpBackend之前执行。我甚至不会到达这一行,因为我在第3行中遇到了一个异常。正如我所说,在加载我的模块/应用程序之前,我无法配置$httpBackend。你发布这个问题已经很久了,但我想问你是否找到了解决方案?我目前面临着同样的问题问题。@Nitesh我创建了第二个名为
myApplicationTests
的模块,具有相同的依赖项,但将
myapp.config
调用替换为静态调用。我重构了所有其他
.config
.run
.value
.constant
调用,以便将它们作为依赖项导入另一个模块在
myApplication
myApplicationTests
中设置cy以保持干燥。我仍然认为必须有更简单的方法。