Angularjs 测试时我应该将原始元素或编译/链接的元素附加到body中吗?

Angularjs 测试时我应该将原始元素或编译/链接的元素附加到body中吗?,angularjs,jasmine,karma-runner,jasmine-jquery,Angularjs,Jasmine,Karma Runner,Jasmine Jquery,当我使用justcompileandlink设置测试时,会触发指令,但元素只存在于limbo中,因为如果我没有显式地将其添加到DOM中,下面的测试将失败 我只是想知道我是否应该将预编译的angular.element(…)添加到DOM或已编译/链接的linkFr(scope)中,或者我的做法是否完全错误 测试设置 据我所知,当您的测试依赖于浏览器来计算某些内容(例如,元素的大小)时,您只需要将元素附加到DOM中。如果这不是必需的,那么你可以把它放在“边缘” 在需要将元素放在DOM中的情况下,使用

当我使用justcompileandlink设置测试时,会触发指令,但元素只存在于limbo中,因为如果我没有显式地将其添加到DOM中,下面的测试将失败

我只是想知道我是否应该将预编译的
angular.element(…)
添加到DOM或已编译/链接的
linkFr(scope)
中,或者我的做法是否完全错误

测试设置
据我所知,当您的测试依赖于浏览器来计算某些内容(例如,元素的大小)时,您只需要将元素附加到DOM中。如果这不是必需的,那么你可以把它放在“边缘”


在需要将元素放在DOM中的情况下,使用编译版本就足够了。我想不出在编译DOM之前将“raw”元素附加到DOM中会有什么用处。

您能提供一个Plunker脚本吗?@MichaelBenford所有代码都在这里,并且都可以使用。这只是一个问题,即哪种方法是正确的,如果它们是相同的,或者另一种方法更好。我需要一个脚本,因为一开始我不认识
toExist()
toBeInDOM()
toBeVisible()
调用,并认为它们是伪代码。但在谷歌快速搜索后,我发现它们是真正的功能(顺便说一句,非常有用)啊,是的,它们非常有用。我使用了全部3个,只是为了涵盖所有的基础,尽管我怀疑它们是否都是必要的。我知道每个都有自己的局限性。好的,谢谢。不过,我确实对这种方法有意见,因为每次测试后,它似乎都不会被清除。我必须手动执行此操作吗?还可以使用jasmine jquery
setFixtures()
。这会自动清理吗?@ogc nick在这种情况下,我通常会模拟body标签,以便在每次测试后自动清理。请看我的这张照片,了解更多细节。
beforeEach(inject(function ($rootScope, $compile) {

    var linkFn, el;

    rootScope = $rootScope;

    scope = $rootScope.$new();

    el = angular.element('\
        <a id="testClickConfirm" href="" ng-click="deleteFn()" click-confirm="Test confirmation message">Delete</a>\
    ');

    // $('body').append(el);

    // The $compile method returns the directive's link function
    linkFn = $compile(el);

    // The link function returns the resulting DOM object
    element = linkFn(scope);

    $('body').append(element);

}));
it('should be added to dom',function(){

    expect(element).toExist();
    expect(element).toBeInDOM();
    expect(element).toBeVisible();

    expect(el).toExist();
    expect(el).toBeInDOM();
    expect(el).toBeVisible();

    expect($('#testClickConfirm')).toExist();
    expect($('#testClickConfirm')).toBeInDOM();
    expect($('#testClickConfirm')).toBeVisible();

}));