当前位置: 首页 > 知识库问答 >
问题:

如何单元测试DOM操作(使用茉莉)

戚衡
2023-03-14

我需要用jasmine对一些DOM操作函数进行单元测试(目前我在浏览器和Karma中运行测试)

我想知道最好的方法是什么?

例如,我可以模拟和存根窗口,记录对象和spyOn的几个函数。但这看起来并不是一个简单的解决方案,所以我要问这个问题!

或者有没有更好的方法(也许不用茉莉花)来做到这一点?

非常感谢

共有2个答案

卫开济
2023-03-14

我一直在为自己寻找一些东西,最后我用19个定制匹配器创建了一个小库。也许你会发现这很有帮助。https://github.com/devrafalko/jasmine-DOM-custom-matchers

仲璞瑜
2023-03-14

我一直在使用jasmine的一个有用的补充,名为jasmine jquery,可以在github上找到。

它允许您访问许多有用的额外匹配器函数,以断言jquery对象及其属性。

到目前为止,我发现特别有用的功能是断言dom元素的属性,以及监视诸如单击和提交之类的事件。。。

这是一个有点做作的例子……:)

describe("An interactive page", function() {
    it("'s text area should not contain any text before pressing the button", function() {
        expect(Page.textArea).toBeEmpty();
    });

    it("should contain a text area div", function() {
        expect(Page.textArea).toBe('div#textArea');
    });

    it("should append a div containing a random string to the text area when clicking the button", function() {
        var clickEvent = spyOnEvent('#addTextButton', 'click');
        $('button#addTextButton').click();

        expect('click').toHaveBeenTriggeredOn('#addTextButton');
        expect(clickEvent).toHaveBeenTriggered();

        expect($('div.addedText:last')).not.toBeEmpty());
    });
});

下面是代码:

var Page = {
    title : 'a title',
    description : 'Some kind of description description',
    textArea : $('div#textArea'),
    addButton : $('button#addTextButton'),


    init : function() {
        var _this = this;
        this.addButton.click(function(){
        var randomString = _this.createRandomString();
            _this.addTextToPage(randomString);
        });
    },

    addTextToPage : function( text ) {
        var textDivToAdd = $('<div>').html('<p>'+text+'</p>');

        this.textArea.append( textDivToAdd );
    },

    createRandomString : function() {
        var text = "";
        var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        for( var i=0; i < 5; i++ )
             text += possible.charAt(Math.floor(Math.random() * possible.length));

        return text;
    },
};

Page.init();

到目前为止,我发现茉莉花非常灵活,使用起来也很愉快,我总是很感激指针让它成为更好的代码!

 类似资料:
  • 我在单元测试(用C#编写)中存根了必要的方法等,但问题是在断言测试之前异步操作没有完成。 我怎么才能绕过这个?我应该创建一个模拟TaskFactory或任何其他技巧来单元测试异步操作吗?

  • 问题内容: 我的控制器具有如下代码: 在我的单元测试中,我正在做这样的事情: 现在在测试中,我正在检查是否调用了服务,并且data1,data2是否未定义。 我的问题是,这是工作的罚款,直到我取代与q.all控制器和测试我个人的服务电话与。使用q.all和(也尝试使用),两个测试均失败,并显示以下错误: 达到10个$ digest()迭代。流产! 如果我删除了,那么承诺永远不会得到解决,而测试失败

  • 我正在单元测试Angular 12组件。组件在初始化时从服务中获取可观察的返回(参见下面的)。它被分配给一个主题,该主题通过管道显示在html模板中(参见下面的)。 AppComponent.ts 模板订阅

  • 问题内容: 摘要: 当在线程中引发断言错误时,单元测试不会消失。这是有道理的,因为不应允许一个线程使另一线程崩溃。问题是我该如何1)当第一个帮助程序线程崩溃时使整个测试失败,或者2)遍历并确定每个线程完成后的状态(请参见下面的代码)。后者的一种方法是通过每个线程具有状态变量,例如“ boolean [] statuss”,并具有“ statuses [i] == false”表示线程失败(可以扩展

  • 我有以下测试: 这是好的,它可以运行,但是我想知道有没有一种方法可以将它作为单元测试而不是集成测试运行,并且仍然使用@mockbean@autowired。还是我错过了什么? 我试着只保留@ExtendWith(SpringExtension.class),但我得到一个关于找不到BookServiceImpl bean的异常。 我知道如何使用MockitoExtension和@mock、@inje

  • 从属性中的pom 在构建部分 这是我最后一次尝试,但pom变得越来越大,没有任何结果