我试图为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
。有没有办法做到这一点?
答案 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框架本身:)