2

RequireJS を介してロードされた単純なバックボーン モデルをテストしようとしています。

define ["backbone"], (Backbone)->

    class Todo extends Backbone.Model 
        defaults:
            title: ''
            priority: 0
            done: false

        validate: (attrs) -> 
            errs = {}
            hasErrors = false

            if (attrs.title is "")
                hasErrors = true
                errs.title = "Please specify a todo"

            if hasErrors
                return errs

        toggleDone: ->
            @save("done", !@get("done"))

    return Todo

私のテストは次のようになります。

requirejs.config 
    baseUrl: "js/"
    paths: 
        jquery: "https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min"
        jqueryui: "https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min"
        json2: "http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2"
        underscore: "http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min"
        backbone: "http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min"
        backboneLocalStorage: "https://raw.github.com/jeromegn/Backbone.localStorage/master/backbone.localStorage-min"
    shim: 
        "underscore":
            exports: "_"
        "backbone": 
            deps: ["jquery", "underscore", "json2"]
            exports: "Backbone"
        "jqueryui": 
            deps: ["jquery"]
        "backboneLocalStorage":
            deps: ["backbone"]
            exports: "Backbone.LocalStorage"

require ["models/todo"], (Todo) ->

    console.log Todo

    TodoTests = TestCase("TodoTests")

    TodoTests::testCreateTodo = -> 
        todo = new Todo({ title: "Hello" })
        assertEquals "Hello", todo.get("title")
        assertEquals 0, todo.get("priority")
        assertEquals false, todo.get("done")

JS テスト ドライバーの構成:

server: http://localhost:3001

load:
  - ../public/js/libs/require.js
  - ../public/js/tests.js

serve:
  - ../public/js/models/*
  - ../public/js/collections/*
  - ../public/js/views/*

Chrome コンソールの JS Test Driver リッスン ページから見た問題:

キャッチされていない SyntaxError: 予期しないトークン <

Chrome から Todo.js を見ると、

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>Console Runner</title><script type="text/javascript">var start = new Date().getTime();</script>
Uncaught SyntaxError: Unexpected token <
<script src="/static/lib/json2.js" type="text/javascript"></script><script src="/static/lib/json_sans_eval.js" type="text/javascript"></script><script src="/static/jstestdrivernamespace.js" type="text/javascript"></script><script src="/static/lib/jquery-min.js" type="text/javascript"></script><script src="/static/runner.js" type="text/javascript"></script><script type="text/javascript">jstestdriver.runConfig = {'debug':false};</script>
<script type="text/javascript">jstestdriver.console = new jstestdriver.Console();

実際の JS ではなく HTML ページであることに注意してください。JS の代わりに HTML ページが返されるため、返されconsole.log(Todo)ます。undefinedこれを間違って設定しましたか?

4

2 に答える 2

3

私はこれに何日も苦労し、JsTestDriver が何をしているのかを最終的に知るまで、Google で際限なく検索しました。で、requirejs.configテストを適切に実行するには、次のbaseUrlことが必要です。

baseUrl: /test/path/to/your/stuff

その理由は、JsTestDriver がサーバーを作成するときに、/test/すべてのディレクトリの先頭に追加するためです。が適切に設定されていない場合、baseUrlウィンドウへの参照をローカルに送り返そうとし始めます。

他に遭遇する可能性のある唯一の問題は、require ステートメントを最初の行としてテストを実行することです。Jasmine があり、require() をテストの一番上に置くとテストが実行されないため、テストの beforeEach でそれを実行し、実行前にオブジェクトを取得する必要がありました。

Jasmine の require ステートメントが機能すると主張する人が無数にいるのを目にしますが、私はおそらく何か間違ったことをしているのでしょう。

于 2012-10-07T04:25:08.187 に答える
1

ajax の応答を確認しましたか? 私はちょうど同じことをしていて、その '<' は、リソース 404'd のときに返された開始 doctype タグからのものでした...

于 2013-01-14T10:29:03.173 に答える