質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

2回答

2061閲覧

実サーバーを用いた、AngularJSのPOSTのテストで、サーバー側でPOSTの値がとれない

tama2015

総合スコア63

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2017/02/08 15:17

編集2017/02/10 14:43

実サーバーを利用した、AngularJSPOSTのテストを行っていますが、
サーバー側でPOSTの値がとれません。
(問題なく動いているAPIでテストしています。)

ソースコードは以下の通りです。どなたか解決方法もしくはヒントを
頂けませんでしょうか?よろしくお願い致します。

参考サイト
ngMockE2E $httpBackend "passThrough()" doesn't work #1434

AngularJS

Javascript

1angular.module('app.service', ['ngResource']) 2 .config(['$logProvider', '$httpProvider', '$locationProvider', function($logProvider, $httpProvider, $locationProvider) { 3 $logProvider.debugEnabled(true); 4 $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;application/json;charset=utf-8'; 5 $locationProvider.html5Mode(true); 6 }]);

Javascript

1angular.module('app.service') 2.factory('Login', ['$resource', function($resource) { 3 "use strict"; 4 return $resource( 5 '', 6 {}, 7 { 8 login: { method: 'POST', url: 'http://hogehoge/login/' } 9 } 10 ); 11}]);

Javascript

1angular.module('appDev', ['app.service', 'ngMockE2E']); 2describe('POSTのテスト', function() { 3 4 var user = { id: 'xxx@yahoo.co.jp', pass:'yyyyyyyy' }; 5 6 beforeEach(function() { 7 angular.module('appDev') 8 .run(function($httpBackend) { 9 $httpBackend.whenPOST(/.*/).passThrough(); 10 }); 11 }); 12 13 it('POSTのテスト', function(done) { 14 $injector = angular.injector(['appDev']); 15 $injector.invoke(function(Login, $rootScope) { 16 var login = new Login(user); 17 login.$login().then(function(value) { 18 expect(value.status).toEqualTo('XXX'); 19 expect(value.message).toEqualTo('XXX'); 20 }).catch(function(data, status) { 21 console.log('status:', status); 22 done.fail(JSON.stringify(data)); 23 }); 24 $rootScope.$digest(); 25 }); 26 }); 27});

FuelPHP

PHP

1class Controller_Api_Login extends Fuel\Core\Controller_Rest { 2 3 protected $format = 'json'; 4 5 public function action_index() { 6 7 $post = Input::json(); 8 Log::debug(print_r($post, true)); -> 空の配列 9 Log::debug('pass:' . $post['pass']); -> 値は取れない。yyyyyyyyが期待されている。 10 Log::debug('id:' . $post['id']); -> 値は取れない。xxx@yahoo.co.jpが期待されている。 11 以下略 12}

エラーログ

LOG: 'status:', undefined Firefox 51.0.0 (Mac OS X 10.10.0) Loginサービスのテスト ログイン成功時のテスト FAILED Failed: {} @js/services/login.service_spec.js:42:9 h/<@https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js:133:460 Hf/this.$get</m.prototype.$eval@https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js:147:309 Hf/this.$get</m.prototype.$digest@https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js:144:412 Hf/this.$get</m.prototype.$apply@https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js:148:76 l@https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js:101:87 rg/</t.onload@https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js:106:489 Firefox 51.0.0 (Mac OS X 10.10.0): Executed 7 of 7 (1 FAILED) (1.438 secs / 1.408 secs)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

以下の部分の記述が間違っておりました。
toEqualToではなくtoEqualでした。
あと、非同期通信のテストなので、done()も記載が
必要でした。

expect(value.status).toEqualTo('XXX'); expect(value.message).toEqualTo('XXX');

expect(value.status).toEqual('XXX'); expect(value.message).toEqual('XXX'); done();

投稿2017/02/10 16:04

tama2015

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

RESTコントローラの使い方がおかしいです。
Rest コントローラ - 概要 - FuelPHP ドキュメント

たぶん、action_indexじゃなくてget_~とかpost_~とかになるはず。

投稿2017/02/10 07:05

編集2017/02/10 07:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tama2015

2017/02/10 14:22

回答ありがとうございます。 そのらのマニュアルにも記載あるのですが post_hogeの代わりにaction_hogeを使うことは できます。 「他のコントローラと同様に、 Rest コントローラにおいても "action_" というプレフィックスのメソッドは、 HTTP メソッドをプレフィックスとしたメソッドの代わりになることに気づくでしょう。 HTTP メソッドに当てはまるプレフィクスのメソッドがない場合、"action_" プレフィクスのメソッドが代わりに呼び出されます。」 ただ、可読性の観点からも、actionは具体的なpostなり getなりにした方が良さそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問