如何用aurelia测试测试负面if.bind

时间:2018-02-15 16:56:12

标签: aurelia

我试图为Aurelia组件编写一个测试,该组件在加载某些数据之前不会显示任何内容。它看起来像这样:

class MyComponent {
    @bindable
    someId;

    myData = undefined;

    someIdChanged() {
        externalService.someLookup(someId).then(data => this.myData = data);
    }
}

带模板

<template>
    <div if.bind="myData !== undefined" class="special-styling">
        ${myData.title}
    </div>
</template>

为最终加载myData的场景编写测试很容易:我可以调用ComponentTester.waitForElement('.special-styling')或其他类似的。但是现在我想编写一个测试,其中加载数据立即失败,并断言div应该不存在。但是,我不确定如何计时:如果我立即检查div是否存在,那可能是因为该组件正常工作且div未显示,但也可能是组件有问题但尚未完成渲染。

目前,作为一种解决方法,我正在做setTimeout(() => expect(div).not.to.exist, 50)这样的事情,但理想情况下,我希望有一些信号表明请求已完成,Aurelia已完成更新,然后断言没有div。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您通常会在private static final String FILE_NAME_FILTER = "1"; private static final String HOME_FOLDER_FILTER = "home"; private static final String VAR_FOLDER_FILTER = "var"; private static final String BIN_FOLDER_FILTER = "bin"; @Test public void test() { File f1 = new File("1", "txt"); File f2 = new File("1", "json"); File f3 = new File("1", "yml"); File f4 = new File("4", "doc"); Folder folder1 = new Folder(HOME_FOLDER_FILTER, asList(f1, f2)); Folder folder2 = new Folder(VAR_FOLDER_FILTER, asList(f2, f3)); Folder folder3 = new Folder(BIN_FOLDER_FILTER, asList(f3, f4)); List<Folder> folders = asList(folder1, folder2, folder3); List<File> files = folders.stream() .filter(folder -> folder.getName().equals(HOME_FOLDER_FILTER)) .map(Folder::getFiles) // no helper method .flatMap(List::stream) .filter(file -> file.getName().equals(FILE_NAME_FILTER)) .collect(Collectors.toList()); Assert.assertEquals(2, files.size()); } 阶段将支票置于queueMicroTask()之后。这确实是确保aurelia完成渲染所需的所有“延迟”。请参阅我之前提供的somewhat related answer,了解原因。

然而,attached()在渲染等方面的时间略有不同。它实际上在实际框架没有的地方使用aurelia-testing。这是为了解释测试框架带来的不可避免的延迟。因此,您需要保留setTimeout(),或者您可以使用setTimeout()(内部使用queueTask())来实现类似效果。

如果你真的想确定,那就这样做:

setTimeout()

据说这样你的测试就没必要了。您需要验证的是,如果您的数据无法加载,传递给ComponentTester.waitForElement('.special-styling', { interval: 5, timeout: 15 })的表达式实际上会计算为false。你现在正在做的是测试if.bind是否也能正常工作,你真的不想/需要测试Aurelia框架本身:)