

本家のほうでも質問させて頂いたのですが、日本語版でも質問させてください。 今、sails.jsを用いてウェブアプリを作成しております。
sails.jsはデフォルトでテスト環境がないため、こちらのサイトを参考にテスト環境を作成しました。
（<http://thenullpointer.in/2014/09/08/Testing-and-code-coverage-using-grunt-
mocha-istanbul-in-Sails-js/index.html>）
そしてテスト用フレームワークにwolfpackをインストールして以下のようなコードを作成し、実行したところ以下のようなメッセージが出てエラーになってしまいます。

[code]

    1) The UserController should return a HTTP 200 response if the user was added successfully:
    ReferenceError: runs is not defined
      at Context.<anonymous> (my_project_path/test/controllers/UserController.spec.js:42:9)
    
    2) The UserController #create ユーザーが作成されるはず:    
    ReferenceError: sails is not defined 
    at Object.module.exports.create (my_project_path/api/controllers/UserController.js:9:457)
    
[/code]

コントローラテストのコードは以下の通りです。 global.jsの中のsails:trueのコメントは外している為、sails
のインポート宣言はグローバルで使えるはずなのですがテストフォルダ以下では使えないのでしょうか？
またテストフォルダ内で使えるようにするための何か設定が必要なのでしょうか？ もし分かる方いらっしゃったらご教授いただけると助かります。

どうぞよろしくお願いします。

[code]

    var UserController = require('../../api/controllers/UserController'),
        sinon = require('sinon'),
        constant = require('../../config/const'),
        User = require('../../api/models/User'),
        wolfpack = require('wolfpack');
    
    global.User = wolfpack(User); 
    
    var request = {
        params: {
            username: 'testuser',
            email: 'testuser@test.com',
            familyname: 'test',
            firstname: 'user',
            gender: constant.constVal.gender.male,
            subscription: true,
            term: true
        }
    };
    
    var response = {
        send: sinon.stub() 
    };
    
    describe('The UserController', function() {
        describe('#create', function() {
            it('ユーザーが作成されるはず', function() {
                UserController.create(request, response);
    
                expect(User.username.lastCall.args[0]).toBe(request.params.username);
                expect(User.email.lastCall.args[0]).toBe(request.params.email);
                expect(User.familyname.lastCall.args[0]).toBe(request.params.familyname);
                expect(User.firstname.lastCall.args[0]).toBe(request.params.firstname);
                expect(User.gender.lastCall.args[0]).toBe(request.params.gender);
                expect(User.subscription.lastCall.args[0]).toBe(request.params.subscription);
                expect(User.term.lastCall.args[0]).toBe(request.params.term);
            })
        });
    
        it("should return a HTTP 200 response if the user was added successfully", function() {
            // Run first part of test asynchronously (jasmine function)
            runs(function() {
                UserController.create(request, response);
            });
    
            // When the callback executes, it should call res.send, so we should wait for it
            waitsFor(function() {
                return response.send.called;
            });
    
            // Now we can test if the proper code was sent
            runs(function() {
                expect(response.send.lastCall.calledWith(200)).toBeTruthy();
            });
        });
    });
    
[/code]


CC BY-SA 3.0
2014-12-23T08:13:04.647
2421
2015-01-22T09:41:53.803
5568
question
javascript テスト node.js
sails.js のユニットテストについて


すみません。自己レスです。 ReferenceError: sails is not defined
に関してはテスト用のUserController.spec.jsではなくUserController.jsのほうでした。ただUserController.jsはglobalでsails:trueとしているので得にインポート宣言しなくても怒られないはずなんですが、ユニットテストだと怒られちゃうんですね。とりあえずrequire('sails)を付け足したらエラーは外れました。

あとReferenceError: runs is not defined
については私のテストではmochaを使っていてこちらのコード（サンプルのコードを流用しています。）はjasmine向けのコードだったためrunsなんてしらないって言われてるのかなと思いました。

mochaだとどう書くのかな？？


CC BY-SA 3.0
2014-12-23T08:48:06.030
2423
2014-12-23T08:48:06.030
5568
2421
answer