2

まず、これは仕事の要件です。この方法でできない場合は、適切な議論が必要です。

jasmine と sinon を使用してバックボーン プロジェクトをテストする必要があります。関数内で jquery 呼び出しをモックする方法がわかりません。私はこのような関数を持っています(余分な呼び出しを破棄するために少しクリーンアップしました):

Project.Views.FormView = Backbone.View.extend({
  sidenavClicked: function(event){



    var sidenav_id = $(event.target).attr('id').split('m')[1];
    var sidenav_num = sidenav_id.split('m')[1];

    var form_id = $('div.active form').attr('id');
    var form_num = form_id.split('m')[1];

    //code for fast scrolling
    this.slideTo(form_num-1, sidenav_num-1);

    return false;
  },
  ...
});

今、slideTo() が呼び出されることをテストしようとしています。これは私のジャスミン仕様です。

describe("Form", function(){
    describe("Carousel", function(){

    it("should call slideTo when navbar is clicked", function(){
        var spy = sinon.spy();
        var formView = new Project.Views.FormView({ el : $('#main'), id : 1});
        formView.bind('slideTo', spy);

        var event = {};
        event.target = "<div id='form1'></div>";

        formView.sidenavClicked(event);
    });
});

エラーメッセージは次のとおりです: TypeError: form_id is undefined in file: .../src/main/webapp/js/views/FormView.js

私が知る限り、jQuery が照合するドキュメントがないためです。form_id に値を持たせるにはどうすればよいですか?

実際のコードは機能し、本来の目的を果たします。

更新: HTML は次のようになります。

<html>
<body>
    <div id="main">
        <ul id="carousel-navbar">
            <li><a id="navlink-form1">Text</a></li>
            ...
        </ul>
        <div id="formCarousel" class=" carousel slide" >
            <div class="active first item">
                <form id="form1" name="question1">
                    ...
                </form>
            </div>
            ...
        </div>
    </div>
</body>
</html>

これとまったく同じではないことを明確にするために(実際の行は442行です)、構造は関連する場合は同義でなければなりません。

4

2 に答える 2

0

これは少し素朴に思えるかもしれませんが、とにかく指摘します。

実際にビューをどこにもレンダリングしていないように思えます。私がこれを言うのは、あなたが投稿したコードのどれも.render()ビューを呼び出しておらず、それが舞台裏で起こっていることを示唆するものは何も見えず、JQuery 呼び出しがそのように動作している理由を説明している可能性があるからです。

Jasmine 仕様内からのビューのレンダリングは、通常、次のように簡単です。

beforeEach(function () {
  // some element you want to render your view into
  $('#testbed').html(view.render().el);
});

form_id探している要素が DOM にないため、未定義である可能性があります。関数内から実際にその要素を見つけることができますか? そして、テスト自体の中から?

.click()(また、その関数はイベントにバインドされているため、個人的には、明示的に呼び出すよりも、そのイベントをトリガーして呼び出す方が理にかなっていると思います。)

于 2013-08-11T12:16:27.930 に答える