【问题标题】:How to write unit tests for events in backbone.js如何为backbone.js中的事件编写单元测试
【发布时间】:2016-10-12 11:39:47
【问题描述】:

我从编写单元测试开始我的冒险,所以请放纵一下。在我的应用程序中,我使用 jQuery、backbone.js 和 underscore.js 并用于测试 mocha.js 和 chai.js。我有问题,因为我不知道如何使用这个工具测试事件。 Fox 示例我有改变输入值的函数。它在更改复选框值后调用。

test.html 文件:

<!DOCTYPE html>
<html>
<head>
    <title>Backbone.js Tests</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <link rel="stylesheet" href="js/lib/mocha.css" />
    <script src="js/lib/mocha.js"></script>
    <script src="js/lib/chai.js"></script>
    <!-- <script src="js/lib/sinon.js"></script> -->
    <script>
        // Setup
        var expect = chai.expect;
        mocha.setup('bdd');

        // Run tests on window load event.
        window.onload = function () {
            (window.mochaPhantomJS || mocha).run();
        };
    </script>

    <!-- App code -->
    <script src="../public/static/js/libs/jquery-2.1.4.min.js"></script>
    <script src="../public/static/js/libs/js.cookie-2.1.0.min.js"></script>
    <script src="../public/static/js/libs/bootstrap.min.js"></script>
    <script src="../public/static/js/libs/underscore-min.js"></script>
    <script src="../public/static/js/libs/backbone-min.js"></script>
    <script src="../public/static/js/libs/backbone-relational.min.js"></script>
    <script src="../public/static/js/libs/backbone-super.min.js"></script>
    <script src="../public/static/js/libs/handlebars-v4.0.5.min.js"></script>
    <script src="../public/static/js/application.js"></script>
    <script src="../public/static/js/main.js"></script>
    <script src="../public/static/js/views/register.js"></script>
    <script src="../public/static/js/views/modals/sign-in-modal.js"></script>
    <script src="../public/static/js/views/modals/sign-up-modal.js"></script>
    <script src="../public/static/js/helpers/forms.js"></script>
    <script src="../public/static/js/helpers/alerts.js"></script>
    <script src="../public/static/js/helpers/inpage-alerts.js"></script>
    <script src="../public/static/js/collections.js"></script>
    <script src="../public/static/js/models.js"></script>
    <script src="../public/static/js/kodilla.lib.js"></script>
    <script src="../public/static/js/views/knowledge-base.js"></script>
    <script src="../public/static/js/libs/tether.min.js"></script>

    <!-- Tests -->
    <script src="js/spec/register.spec.js"></script>

</head>
<body>
    <div id="mocha"></div>
</body>
</html>

register.js 文件:

App.Views.Register = Backbone.View.extend({
    events: {
        'click input[name="terms"]' : 'changeTermsConfirmation',
        'click [type=submit]': 'onSubmitForm'
    },
    initialize: function(options) {
        this.$termsConfirmedAtHidden = this.$('input[name="terms_confirmed_at"]');
    },
    changeTermsConfirmation: function(e) {
        if ($(e.currentTarget).is(":checked")) {
            this.$termsConfirmedAtHidden.val(Math.floor(Date.now() / 1000));
        } else {
            this.$termsConfirmedAtHidden.val('');
        }
    },
    onSubmitForm: function() {
        if (!this.$el.find('input[name="terms"]').is(':checked')) {
            analytics.track('auth_register_not_checked_terms');
        }
    }
});

register.spec.js 文件:

$(document).ready(function() {

    describe('Register Form', function() {

        App.registerView = new App.Views.Register();

        describe('initialize() function', function() {
            it('Should initialize this.$termsConfirmedAtHidden variable by HTML object', function () {
                expect(App.registerView.$termsConfirmedAtHidden).to.be.a('object');
            });
        });

        describe('changeTermsConfirmation() function', function() {
            it('Should set value of $termsConfirmedAtHidden element', function () {
                //how to test this function
            });
        });

    });

});

我的问题是如何为“changeTermsConfirmation()”函数编写合理的单元测试。我会感谢其他人的笔记、使用提示。

【问题讨论】:

    标签: javascript jquery unit-testing backbone.js


    【解决方案1】:

    也许我可以为您提供一些可能帮助您入门的信息。

    Mocha/Chai 是模块化的,所以首先你需要在你的项目中包含一个 mocking/spying 库。大多数人的默认选择似乎是Sinon(以及Sinon-Chai)。

    然后您可以检查和单元测试您的事件处理程序:

    • 为您的测试创建一个视图实例。
    • 在您要测试的视图方法上设置一个间谍(changeTermsConfirmation 在您的情况下)
    • 通过在您的视图实例上调用 trigger 来触发事件
    • 您的期望可以检查您的方法被调用的频率、使用了哪些参数以及它的返回值是多少。

    如果您不关心这些,只想测试视图状态更改,则不需要间谍(也不需要包含像 Sinon 这样的库)。只需创建一个视图实例,调用trigger 并检查结果。

    【讨论】:

    • 感谢您的回复!你能告诉我更多关于创建实例视图的信息吗?你的意思是我应该创建单独的 html 标记?在这种情况下,有什么方法可以从一页或终端调用所有测试?
    • 您可以使用您拥有的 HTML 文档。获取body,附加div,在div 中创建您的视图,清理div。如果您在浏览器中运行测试,body 属于测试(结果)页面 - 使用它没有问题。如果您从命令行运行测试,您可以使用像PhantomJS 这样的(无头)浏览器,然后body 属于该浏览器的默认文档。
    • 感谢您提供此解决方案。我知道这会起作用,但这是一种好的做法(我的意思是在当前 html 页面的正文中附加一些 div )?对不起,也许是愚蠢的问题,但我真的是这个主题的初学者;)
    • 没关系,除非您的测试由于某种原因没有正确封装。我已经运行了测试(与 Backbone 无关),其中文档大小或滚动条的存在很重要——然后画布必须是干净的。或者,您可以创建子窗口或 iframe,但随后您必须处理其他问题。例如,大多数浏览器会阻止子(即弹出)窗口,因此您必须在测试开始之前更改浏览器设置 - 不太好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2012-01-06
    • 2019-03-17
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多