我试图从Angular 2中的模拟后端获得单元测试的结果.目前,我们使用fakeAsync超时来模拟时间的流逝.
目前的工作单位测试
it('timeout (fakeAsync/tick)', fakeAsync(() => {
counter.getTimeout();
tick(3000); //manually specify the waiting time
}));
Run Code Online (Sandbox Code Playgroud)
但是,这意味着我们仅限于手动定义的超时.不是在异步任务完成时.我要做的是tick()等待任务完成后再继续测试.
这似乎没有按预期工作.
阅读fakeAsync和tick答案在这里解释说:
tick()模拟异步时间的流逝.
我设置了一个模拟这个场景的plnkr示例.
在这里,我们调用getTimeout()调用具有超时的内部异步任务的方法.在测试中,我们尝试包装它并tick()在调用getTimeout()方法后调用.
counter.ts
getTimeout() {
setTimeout(() => {
console.log('timeout')
},3000)
}
Run Code Online (Sandbox Code Playgroud)
counter.specs.ts
it('timeout (fakeAsync/tick)', fakeAsync(() => {
counter.getTimeout();
tick();
}));
Run Code Online (Sandbox Code Playgroud)
但是,单元测试失败,错误"错误:1个计时器仍在队列中".
是否可以使用tick()这种方式等待超时功能?或者我可以使用另一种方法吗?
我们正在使用Angular 2实现拖放功能.
我正在使用该dragover事件来运行该preventDefault()功能.这样的drop事件就像这个问题中解释的那样.
该dragover方法由onDragOver组件中的函数处理.
<div draggable="true"
(dragover)="onDragOver($event)">
...
Run Code Online (Sandbox Code Playgroud)
在组件中,此功能可防止默认行为,允许将拖动的项目放在此目标上.
onDragOver(event) {
event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作.每隔几百毫秒就会触发一次dragover事件.
但是,每次onDragOver调用该函数时,Angular 2都会运行其摘要周期.这会降低应用程序的速度.我想在不触发摘要周期的情况下运行此功能.
我们使用的解决方法是订阅元素事件并在Angular 2的上下文之外运行它,如下所示:
constructor( ele: ElementRef, private ngZone: NgZone ) {
this.ngZone.runOutsideAngular( () => {
Observable.fromEvent(ele.nativeElement, "dragover")
.subscribe( (event: Event) => {
event.preventDefault();
}
);
});
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但有没有办法实现这一点,而无需直接访问nativeElement?
我在单页应用程序中使用 html5 Dragevents。
目前,我正在监听dragleave和dragenter事件以在元素上设置正确的类。
但是,当两个有效的目标元素(A 和 B)彼此相邻,并且我们将一个元素通过 A 拖入 B 时,事件将按以下顺序触发。
+--------------+-------------+
| | |
+-------+ | A | B |
| | | | |
| Elem +------------------------------------> |
| | | | |
+-------+ | | |
+--------------+-------------+
Run Code Online (Sandbox Code Playgroud)
dragenter的 Adragenter的 Bdragleave的 A事件的预期顺序是,
dragenter的 Adragleave的 Adragenter的 B我认为这就是顺序,因为该物品必须A在进入之前离开B。我在这里错过了什么吗?dragenter在此之前被解雇有理由吗dragleave?有没有办法改变这种行为?
我这里有一个 JSFiddle 。
代码本身非常简单,dragenter可以dragover …
我正在尝试使用一个lambda方法或字符串的联合类型的属性.
class TestClass {
name: string | () => string;
}
Run Code Online (Sandbox Code Playgroud)
可在此处访问非工作TS游乐场样本
但是TS编译器给出了一个错误:"[ts]成员'字符串'隐式具有'任意'类型."
类型声明不正确吗?或者有解决方法吗?
我正在尝试使用标签@ContentChildren来拾取所有物品#buttonItem.
@ContentChildren('buttonItem', { descendants: true })
Run Code Online (Sandbox Code Playgroud)
当我们直接在父组件中包含ref项时,这是有效的.
<!-- @ContentChildren returns child item -->
<parent-component>
<button #buttonItem></button>
<parent-component>
Run Code Online (Sandbox Code Playgroud)
但是,如果带有#buttonItemref 的元素包含在自定义组件中,@ContentChildren即使我设置了该{descendants: true}选项,也不会被选中.
<!-- @ContentChildren returns empty -->
<parent-component>
<child-component-with-button-ref></child-component-with-button-ref>
<parent-component>
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的StackBlitz示例来演示这一点.
我正在尝试测试Angular 2组件,它依赖于服务调用来填充数据.但是,这个服务调用promise是在另一个函数内部处理的.
this.data = null; //empty data is defined here.
public getDataMethod(){
// controller related logic
privateService.privateMethod(
(data) => {this.data = data} //the data is populated here
)
}
Run Code Online (Sandbox Code Playgroud)
我怎么能等待内部函数解决?
我读到我们可以等待承诺以"完成"来解决,但我发现的唯一例子是直接调用承诺.(不是函数内的嵌套promise)
我尝试将done方法传递给函数,它运行良好.
public getDataMethod(done){
// controller related logic
privateService.privateMethod(
(data) => {this.data = data} //the data is populated here
done(); //Calling done when the promise is resolved.
)
}
Run Code Online (Sandbox Code Playgroud)
但是,这确实使得经过测试的代码变得混乱.data在运行测试之前是否有更好的方法等待填充值?
在Selenium中,可以扩展元素。这样就可以使用一组可重用的自定义元素进行测试。
例如,我们可以getText添加一个方法。
public static string GetText(this IWebDriver driver)
{
return driver.FindElement(By.TagName("body")).Text;
}
Run Code Online (Sandbox Code Playgroud)
并按以下方式重复使用:
myElement.getText();
此示例在此处进行了详细说明:http : //www.vcskicks.com/selenium-extensions.php
有没有办法在Cypress.io中复制此行为?还是我们需要查询并调用相同的方法来获取数据?
我正在使用 Angular 5。我需要更新基于 selectedMobile 的数组值。我的编码:
const mobilelist = [
{ 'key': 'apple', 'name': 'Apple', 'checked': false },
{ 'key': 'sumsung', 'name': 'Sumsung', 'checked': false },
{ 'key': 'oneplus', 'name': 'Oneplus', 'checked': false },
{ 'key': 'mi', 'name': 'Mi', 'checked': false }
];
const selectedMobile = ['apple'];
const newmobilelist: any = [];
if (selectedMobile.length > 0) {
mobilelist.forEach(element => {
if (selectedMobile.find(x => x == element.key) != null) {
newmobilelist.push({ 'key': element.key, 'name': element.name, 'checked': true });
} else {
newmobilelist.push({ …Run Code Online (Sandbox Code Playgroud) angular ×5
javascript ×3
jasmine ×2
typescript ×2
unit-testing ×2
asynchronous ×1
cypress ×1
html ×1
mouseevent ×1