Javascript 乡绅正在打破其他测试

Javascript 乡绅正在打破其他测试,javascript,requirejs,jasmine,karma-runner,squirejs,Javascript,Requirejs,Jasmine,Karma Runner,Squirejs,我正在使用Karma,Jasmine,Jasmine.Async,Sinon和Chai 好消息是…这个测试工作正常。依赖关系被模拟,间谍被调用,故意破坏测试主题会导致测试失败 define(['chai', 'squire'], function (chai, Squire) { var should = chai.should(), async = new AsyncSpec(this), subject, injector = new Squire(

我正在使用Karma,Jasmine,Jasmine.Async,Sinon和Chai

好消息是…这个测试工作正常。依赖关系被模拟,间谍被调用,故意破坏测试主题会导致测试失败

define(['chai', 'squire'], function (chai, Squire) {

    var should = chai.should(),
        async = new AsyncSpec(this),
        subject, injector = new Squire();

    describe('EventsView', function () {

        describe('when an event is clicked', function () {
            var mockModel, stub;

            async.beforeEach(function (done) {
                setFixtures('<div id="screen"></div>');

                mockModel = {
                    toJSON: function () {
                        return {
                            dimensions: "hu1 vu2",
                            events: [{
                                date: "8/29/2013",
                                id: "8923",
                                title: "Fancy Show",
                                venue: "Lovely venue",
                            }, {
                                date: "8/29/2013",
                                id: "9034",
                                title: "Exciting Game",
                                venue: "Lovely stadium"
                            }],
                            id: 3566,
                            kind: "events",
                            title: "Top events this week"
                        };
                    },
                    fetch: function () {}
                };
                stub = sinon.stub();
                injector.mock('tiles/events-tile/events-detail-model', Squire.Helpers.constructs({
                    fetch: stub
                }));
                injector.require(["tiles/events-tile/events-view"], function (ev) {
                    subject = new ev(mockModel);
                    done();
                });
            });

            async.afterEach(function (done) {
                injector.clean();
                injector.remove();
                done();
            });


            async.it('should attempt to fetch the event details', function (done) {
                $('#screen').html(subject.$el);
                $('.event').first().click();
                stub.called.should.be.true;
                done();
            });
        });
    });
});

然后,其他测试再次工作。我以前也有过类似的事情发生过,通常都是因为sinon模拟没有恢复。
injector.clean()
调用似乎并没有提供我所希望的神奇子弹。

根据我的经验,Squire带来的麻烦远多于它所解决的问题。你在使用jQuery插件吗?我发现他们和乡绅相处不好,可能导致后续测试失败。如果是这样的话,看看如何处理


然而,我的建议是完全抛弃乡绅。使用sinon并创建您自己的实用程序来精确模拟您需要的内容,不仅可以使您的异步测试再次同步(测试中的代码是同步的),还可以鼓励创建更多可测试的代码。它还可以帮助您在更深层次上理解代码和库—stubing Backbone.history在不触发路由的情况下执行路由操作是一个很好的练习,也是添加到测试库中的一个非常有用的工具。

问题在于非AMD模块。如果我没记错的话,当Squire创建一个新的上下文时,它将在全局名称空间中创建一个非AMD模块的新实例。结果是您的代码和测试将引用不同的对象。我想我通过以下方式解决了这个问题:

var injector = new Squire();
injector.mock("backbone", function() {
  return Backbone;
});

Squire应该更好地处理非AMD模块。

最后我们改用Testr而不是Squire,所以我不能说这是否能解决问题,但它看起来确实走在了正确的轨道上。有几个jQuery插件和主干,所以AMD文化冲突似乎是一个可能的罪魁祸首。
var injector = new Squire();
injector.mock("backbone", function() {
  return Backbone;
});