0

私はRails3.2.8をjasmine-railsgemで実行しています。ジャスミンのセットアップを説明する私のGemfileの行は次のとおりです。

 jasmine (1.2.1)
  jasmine-core (>= 1.2.0)
  rack (~> 1.0)
  rspec (>= 1.3.1)
  selenium-webdriver (>= 0.1.3)
jasmine-core (1.2.0)
jasmine-headless-webkit (0.8.4)
  coffee-script
  jasmine-core (~> 1.1)
  multi_json
  rainbow
  sprockets (~> 2)
jasmine-rails (0.1.0)
  jasmine
  jasmine-headless-webkit
  rails (>= 3.1.0)

また、jasmine-jquery拡張機能を使用しています。この一連の関数は、テストで使用しているtoHaveTextメソッドを提供します。jasmine-jquery拡張ファイルをspec/javascripts/helpersディレクトリに保存しました。

spec / javascriptsディレクトリ内に直接あるUserInvitationsSpec.jsというテストファイルには、次のコンテンツが含まれています。

describe ("my basic jasmine jquery test", function(){

    beforeEach(function(){
        $('body').append('<a id="test_link" href="somewhere.html">My test link</a>');
    });

    afterEach(function(){
        $('a#test_link').remove();
    });

    it ("does some basic jQuery thing", function () {
        $('a#test_link').click();
        expect($("a#test_link")).toHaveText('My test link is now longer');
    });

    it ("does some the same basic jQuery thing with a different trigger type", function () {
        $('a#test_link').trigger('click');
        expect($("a#test_link")).toHaveText('My test link is now longer');
    });

});

describe ('subtraction', function(){

    var a = 1;
    var b = 2;

    it("returns the correct answer", function(){
        expect(subtraction(a,b)).toBe(-1);
    });

});

ご覧のとおり、jQuery以外のテストが期待どおりに機能していることを示すために、基本的なjavascriptテストを含めました。

app / Assets / javascriptsディレクトリにある私のjavascriptファイルcore.jsには、次の内容が含まれています。

function subtraction(a,b){
    return a - b;
}

jQuery (function($) {

    $("a#test_link").click(changeTheTextOfTheLink)
    function changeTheTextOfTheLink(e) {
        e.preventDefault()
        $("a#test_link").append(' is now longer');
    }

});

そして、ターミナルから「bundle exec jasmine-headless-webkit」を実行すると、次のように出力されます。

FF.
FAIL: 3 tests, 2 failures, 0.013 secs.

my basic jasmine jquery test does some basic jQuery thing. (/Users/rebekah/OPSWAT/opswat_cwm/spec/javascripts/UserInvitationsSpec.js:11)
  Expected '<a id="test_link" href="somewhere.html">My test link</a>' to have text 'My test link is now longer'. (line ~13)
    expect($("a#test_link")).toHaveText('My test link is now longer');

my basic jasmine jquery test does some the same basic jQuery thing with a different trigger type. (/Users/rebekah/OPSWAT/opswat_cwm/spec/javascripts/UserInvitationsSpec.js:16)
  Expected '<a id="test_link" href="somewhere.html">My test link</a>' to have text 'My test link is now longer'. (line ~18)
    expect($("a#test_link")).toHaveText('My test link is now longer');

同じapp/Assets / javascriptsディレクトリにある私のapplication.jsファイルには、次の内容が含まれています。

//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree . 

そして、spec / javascripts/supportディレクトリにある私のjasmine.ymlファイルには次の内容が含まれています。

 src_files:
  - "application.{js,coffee}"

 stylesheets:

 helpers:
   - "helpers/**/*.{js,coffee}"

 spec_files:
   - "**/*[Ss]pec.{js,coffee}"

 src_dir: "app/assets/javascripts"

 spec_dir: spec/javascripts

 asset_paths:
  - "vendor/assets/javascripts"

アプリで正しく機能するjQuery関数がテスト環境で実行されない理由はありますか?

本当にありがとう!

-レベカ

4

1 に答える 1

1

jQueryのdocument.readyイベント(jQuery(function ($) { … });)はJasmineのイベントの前に実行beforeEachされています。つまり、ドキュメントにまだ追加されていないリンクにクリックハンダーをバインドしようとしています。

簡単な例を次に示します。

// application.js

jQuery(function ($) {
    console.log("In document.ready");
});

// test_spec.js

describe("the order of things", function () {
    beforeEach(function () {
        console.log("In beforeEach");
    });

    it("should run some tests", function () {
        console.log("In test");
    });
});

これにより、この出力が得られます。

$ bundle exec jasmine-headless-webkit
"In document.ready"

Running Jasmine specs...
"In before each"
"In test"
.
PASS: 1 test, 0 failures, 0.004 secs.

残念ながら、カスタムHTMLテンプレートの使用に関するJasmine Headless Webkit(jasmine-railsが舞台裏で使用しているもの)のドキュメントには何も見つかりません。

于 2012-09-10T20:24:34.523 に答える