私は、インターネット上にこの質問に関する情報がたくさんあることを知っています(私を信じて、全部で2日を費やしました)。これまで私が見つけたものは、私を本当に助けてくれません。ここでその角度依存性を嘲笑せずに角度コントローラをテストする
は、私がテストしたいコントローラである:ここでは
(function() {
"use strict";
angular
.module("productManagement")
.controller("ProductListController", ["productResource", ProductListController]);
function ProductListController(productResource) {
var vm = this;
productResource.query(function(data) {
vm.products = data;
});
vm.showImage = false;
vm.toggleImage = function() {
vm.showImage = !vm.showImage;
}
}
})();
作品ジャスミンのテストです:
describe('Controller: ProductListController', function() {
var ProductListController;
beforeEach(function() {
module('productManagement');
inject(function($controller) {
ProductListController = $controller('ProductListController', {});
});
});
it ('showImage should be false', function() {
expect(ProductListController.showImage).toBe(false);
});
});
をすべて良いが、今私が作るためにvm.productsをテストしたいですそのデータがあることを確認してください。
ただし、以下のジャスミンテストが失敗した(これは私が実際にテストしたいものです):
describe('Controller: ProductListController', function() {
var ProductListController;
beforeEach(function() {
module('productManagement');
inject(function($controller) {
ProductListController = $controller('ProductListController', {});
});
});
it ('products should be defined', function() {
expect(ProductListController.products).toBeDefined();
});
});
エラーは「未定義が定義されることを想定して」されています。だから何らかの理由で製品にデータが取り込まれていないのですが、角度付きアプリを正常に動かすとうまくいきます。
これで、のproductResourceの内部で何が起こっているのだろうかと疑問に思うかもしれません。 さて、ここであなたが行く:
(function() {
"use strict";
angular
.module("common.services")
.factory("productResource", ["$resource", productResource]);
function productResource($resource) {
return $resource("/api/products/:productId");
}
})();
私の角度アプリは、実際にいくつかの偽の製品情報を返すために$ httpBackend使用しています。だから私はジャスミンテストでこれを嘲笑したくない、それは私のモックを嘲笑するようなものだろうから。しかし、技術的にはこれは単体テストなので、私はジャスミンテストでhttpBackendを真似しなければなりません。
describe('Controller: ProductListController', function() {
var ProductListController, httpBackend, $resource;
beforeEach(function() {
module('productManagement');
inject(function(_$httpBackend_, $controller, _$resource_) {
httpBackend = _$httpBackend_;
ProductListController = $controller('ProductListController', {});
$resource = _$resource_;
});
});
/*afterEach(function() {
//httpBackend.flush();
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});*/
it ('products should be defined', function() {
var productsUrl = '/api/products/:productId';
var products;
httpBackend.whenGET(productsUrl).respond({
'one': 1,
'two': 2
});
httpBackend.expectGET(productsUrl);
var rec = $resource("/api/products/:productId");
rec.query(function(data) {
products = data;
});
//httpBackend.flush();
expect(products.one).toBe(1);
});
});
私はhttpBackend.flushを(コメントアウトする必要がある)エラーのため:まあ、私はあまりにも....ここ
が、私は私のテストでhttpBackendを模擬しようとしたコードであることを試してみました'待つ必要がありません!'また、「不満足なリクエスト」などの他のエラーのために、afterEach関数をコメントアウトする必要があります。
これでうまくいきましたが、コントローラの機能はテストしていませんが、$ resourceをテストしています。だから、これはちょうど私にとって正しいとは思わない。
私が間違っていることを教えてもらえますか?私は最初の方法をやってみたいと思っていますが、この時点で私は何でもできるでしょう!
実際に私の角型アプリケーションで$ httpBackendを使用しています。私は、複数のアプリケーションを構築するために、複数のチュートリアルを行ってきました。それが、アプリケーションでやっていることです。したがって、私はジャスミンテストで$ httpBackendを再び模倣する必要があるとは感じません。それは私のジャスミンテストで$ httpBackendを模倣しようとすると、私はまだ成功していないと言われています。提案されたアプローチでは、「フラッシュする要求がありません!」というエラーがスローされます。ジャスミンテストでURLを実際に呼び出すために$リソースを取得するのがうまくいかず、正しく動作していないようです。そこに任意のアイデア? – BradStell
1)プロダクションコードで** $ httpBackend **を使用していることを意味しますか? 2)URLを呼び出すために$ resourceを取得しようとしていますか? $ resourceのフードの下で呼び出されるURLは、** $ httpBackend.expectGET(URL)** – piethraz
で指定されているものと同じでなければなりません1)yes "production"コードで$ httpBackendを使用しています。実際の制作ではなく、チュートリアルに従っていました。チュートリアルでは、$ httpBackendを使用してチュートリアルの目的でデータベースをシミュレートするサービスを設定しています。 2)$ httpBackBack.expectGETが期待しているのと同じurlである私のジャスミンコードで$ resourceを使用しています。 – BradStell