小编nip*_*777的帖子

Angular 2 fakeAsync在使用tick()的函数中等待超时?

我试图从Angular 2中的模拟后端获得单元测试的结果.目前,我们使用fakeAsync超时来模拟时间的流逝.

目前的工作单位测试

it('timeout (fakeAsync/tick)', fakeAsync(() => {
    counter.getTimeout();
    tick(3000); //manually specify the waiting time
}));
Run Code Online (Sandbox Code Playgroud)

但是,这意味着我们仅限于手动定义的超时.不是在异步任务完成时.我要做的是tick()等待任务完成后再继续测试.

这似乎没有按预期工作.

阅读fakeAsynctick答案在这里解释说:

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()这种方式等待超时功能?或者我可以使用另一种方法吗?

javascript unit-testing asynchronous jasmine angular

17
推荐指数
4
解决办法
2万
查看次数

Angular 2如何防止事件触发摘要循环/检测周期?

我们正在使用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?

event-handling mouseevent angular

15
推荐指数
2
解决办法
5616
查看次数

HTML 5 拖动事件:“dragleave”在“dragenter”之后触发

我在单页应用程序中使用 html5 Dragevents。

目前,我正在监听dragleavedragenter事件以在元素上设置正确的类。

但是,当两个有效的目标元素(A 和 B)彼此相邻,并且我们将一个元素通过 A 拖入 B 时,事件将按以下顺序触发。

                     +--------------+-------------+
                     |              |             |
+-------+            |     A        |     B       |
|       |            |              |             |
| Elem  +------------------------------------>    |
|       |            |              |             |
+-------+            |              |             |
                     +--------------+-------------+
Run Code Online (Sandbox Code Playgroud)
  1. dragenter的 A
  2. dragenter的 B
  3. dragleave的 A

事件的预期顺序是,

  1. dragenter的 A
  2. dragleave的 A
  3. dragenter的 B

我认为这就是顺序,因为该物品必须A在进入之前离开B。我在这里错过了什么吗?dragenter在此之前被解雇有理由吗dragleave?有没有办法改变这种行为?

我这里有一个 JSFiddle 。

代码本身非常简单,dragenter可以dragover …

html javascript drag-and-drop

6
推荐指数
1
解决办法
1600
查看次数

具有函数的Typescript Union类型

我正在尝试使用一个lambda方法或字符串的联合类型的属性.

class TestClass {
    name: string | () => string;
}
Run Code Online (Sandbox Code Playgroud)

可在此处访问非工作TS游乐场样本

但是TS编译器给出了一个错误:"[ts]成员'字符串'隐式具有'任意'类型."

类型声明不正确吗?或者有解决方法吗?

typescript

5
推荐指数
2
解决办法
433
查看次数

@ContentChildren没有在自定义组件中拾取项目

我正在尝试使用标签@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-decorator angular

5
推荐指数
1
解决办法
340
查看次数

Jasmine在测试函数内等待异步函数

我正在尝试测试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在运行测试之前是否有更好的方法等待填充值?

javascript unit-testing jasmine angular

3
推荐指数
1
解决办法
2500
查看次数

如何在Cypress.io中创建类似于Selenium扩展元素的可重用元素?

在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中复制此行为?还是我们需要查询并调用相同的方法来获取数据?

automated-tests cypress

2
推荐指数
1
解决办法
1604
查看次数

更新打字稿中的数组元素值(Angular)

我正在使用 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)

typescript angular

2
推荐指数
1
解决办法
1万
查看次数