单元测试 Angular Observables

2023-12-02

我是测试领域的新手,刚刚开始为现有的 Angular 2 代码编写单元测试。我有一个函数confirmDelete返回Obserable<boolean>和内部使用ConfirmationServicePrimeNG 来获取用户对弹出窗口的反馈。

该函数的定义如下:

confirmDelete(): Observable<boolean> {
    let confirmObservable = Observable.create((observer: Observer<boolean>) => {            
        this.confirmationService.confirm({
            header: 'Delete Confirmation',
            message: 'Do you really want to delete this record?',
            accept: () => {
                observer.next(true);
                observer.complete();            
            },
            reject: () => {
                observer.next(false);
                observer.complete();
            }
        });

    });

    return confirmObservable;

}

我想为这段代码编写一个单元测试。我计划为ConfirmationService但因为我是单元测试世界的新手,我发现很难设置这些东西。

我的问题是在这种特定情况下编写单元测试的正确方法是什么。

EDIT:-

我尝试了 @peeskillet 提出的解决方案,但后来我开始收到类型不匹配错误ConfirmationService and MockConfirmationService.

以下是声明ConfirmationService and ConfirmationPrimeNG 库中找到的类。

export interface Confirmation {
    message: string;
    icon?: string;
    header?: string;
    accept?: Function;
    reject?: Function;
    acceptVisible?: boolean;
    rejectVisible?: boolean;
    acceptEvent?: EventEmitter<any>;
    rejectEvent?: EventEmitter<any>;
}
export declare class ConfirmationService {
    private requireConfirmationSource;
    private acceptConfirmationSource;
    requireConfirmation$: Observable<Confirmation>;
    accept: Observable<Confirmation>;
    confirm(confirmation: Confirmation): this;
    onAccept(): void;
}

我可能会让模拟保留参考文献accept and reject功能。然后在测试中您可以调用它们来检查它们是否发出正确的布尔值。就像是

class MockConfirmationService {
  accept: Function;
  reject: Function;

  confirm(config: any) {
    this.accept = config.accept;
    this.reject = config.reject;
  }
}

然后在你的测试中只需调用accept测试一下true被发出,并调用reject测试一下false被发射。

describe('serivce: ModalService', () => {

  let modalService: ModalService;
  let confirmService: MockConfirmationService;

  beforeEach(() => {
    confirmService = new MockConfirmationService();
    TestBed.configureTestingModule({
      providers: [
        ModalService,
        { provide: ConfirmationService, useValue: confirmService }
      ]
    });

    modalService = TestBed.get(ModalService);
  });

  it('should return true when accepted', async(() => {
    modalService.confirmDelete().subscribe(result => {
      expect(result).toBe(true);
      console.log('accepted test complete');
    });
    confirmService.accept();
  }));

  it('should return false when rejected', async(() => {
    modalService.confirmDelete().subscribe(result => {
      expect(result).toBe(false);
      console.log('rejected test complete');
    });
    confirmService.reject();
  }));
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试 Angular Observables 的相关文章

随机推荐

  • 使用 Capybara/Selenium Webdriver 测试 HTML5 文件上传 - Ruby

    我有一个简单的模式 其中向用户显示浏览按钮以添加要上传的文件 由于一个未知的问题 无论是HTML5文件输入还是浏览器添加了自己的功能 这都成为测试的痛苦 在我的页面上有
  • 为什么一个简单的任务需要两个 SQL Server Service Broker 队列?

    我在网上找到的所有使用 SQL Server Service Broker 队列的示例似乎都有两个队列 我不明白为什么 每个例子似乎都假设这是显而易见的 没有必要解释 有几件事将写入我的队列 存储过程将从队列中读取并插入到数据库中 为什么我
  • 存储过程或 OR 映射器?

    哪个更好 或者使用 and OR 映射器与 SP 一起使用 如果您已经拥有带有 SP 的系统 那么 OR 映射器值得吗 我喜欢 ORM 因为你不必重新发明轮子 话虽如此 这完全取决于您的应用程序需求 开发风格和团队的风格 这个问题已经被覆盖
  • 在python中将UNIX时间戳转换为str并将str转换为UNIX时间戳[重复]

    这个问题在这里已经有答案了 例如 我想转换 UNIX 时间戳1385629728 to str 2013 11 28 17 08 48 并转换 str 2013 11 28 17 08 48 到 UNIX 时间戳1385629728 请按如
  • GDK - 防止实时卡上的屏幕变暗

    我发布了一张高频实时卡片 我希望在用户查看该卡片时防止屏幕变暗 我意识到这是一个与此重复的问题 适用于 Google Glass 的 GDK APK 防止屏幕变暗 但答案似乎不再有效 示例项目也不再保留在屏幕上 我也尝试过获取唤醒锁但没有成
  • ADO.NET 的 SqlCommand.CommandTimeout 如何工作?

    考虑一个存储过程 它在不使用事务的情况下大约在 60 秒内更新一些行 我们设置ADO NET的SqlCommand 超时至 30 秒 SqlCommand Timeout 30 当超时发生在 30 秒时 存储过程是否会继续在数据库服务器中运
  • 启动一个完全独立于Python的进程

    我正在尝试从 python 启动一个完全独立的进程 我不能使用像这样简单的东西os startfile因为我需要传递参数 目前我正在使用subprocess popen这让我完成了 90 的任务 args some exe exe some
  • MPMovies PlayerViewController 进入背景时变黑

    我的 MPMoviePlayerViewController 有问题 当应用程序进入后台然后我再次启动它或转到另一个 viewControllers 时 电影变黑了 我有在菜单背景中播放的电影 这是我的代码 编辑代码 void viewDi
  • 页面刷新后保留下拉列表的选定值

    我有一个按钮可以根据多个下拉值中的选择来过滤列表 但是 我遇到了一个问题 一旦单击按钮 页面就会刷新 并且下拉值将重置为默认值 如何确保刷新后所选值保留在下拉列表中 div div
  • 隐含的路径归纳

    这是一个后续问题在 Agda 中进行路径归纳 我想知道什么时候这个结构可能更具表现力 在我看来 我们总是可以这样表达 f forall A gt x y A gt x y gt some type f refl instance of so
  • MySQL:获取父子结构的根节点

    我有一个与此类似的表 Id ParentId 1 0 2 1 3 0 4 3 5 3 6 0 7 6 8 7 给定一
  • 如何使用 C# Parallel.For 实现 OpenMP 多级代码

    如何使用 C Parallel For 在以下 OpenMP 代码中实现 OpenMP 代码 pragma omp parallel float data new float 1000 pragma omp for for int i 0
  • 即使未注册,也会在 WooCommerce 感谢页面上显示客户详细信息

    在 WooCommerce 中 对于登录用户 感谢 已收到订单 页面确实会显示客户详细信息 例如姓名 地址和电子邮件 但是当客户未注册时什么也没有 如何确保非注册用户在支付成功后 能像注册用户一样在Thankyou 已下单 页面看到自己的详
  • 如何使用HtmlAgilityPack进行异步调用?

    我正在尝试获取带有 id 的表table matches可用的here 问题是表是使用加载的ajax所以我没有得到完整的html下载页面时的代码 string url http www oddsportal com matches socc
  • 如何使用 Firestore 数据库快照填充表日历

    我正在尝试填充要在 TableCalendar 上显示的事件地图 使用表日历包 要填写事件 我需要一个 Map 所以一开始我创建了这个 Map
  • VB.net 到 MySql 存储过程错误

    我是存储过程的新手 所以我可能会错过一些简单的东西 但我研究了基础知识 并且一直试图从 vb net 代码集成它 我创建了一个简单的存储过程 我认为 它只运行今天结果的数据查询 例行DDL 注意 例程主体前后的注释不会被服务器存储 DELI
  • 显示最后一个非空单元格的地址(如果值不唯一)

    我有以下 Excel 电子表格 A B C D E F 1 Jan Feb March April May 2 Profit 100 200 200 3 Cell Reference last non empty cell In Row 2
  • 如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877

    我面临一个奇怪的问题 我正在尝试将一些数字转换为 单词 只需这样做 TO CHAR TO TIMESTAMP LPAD nvl trunc 99999999 0 9 0 FF9 FFSP AS amt in words 效果很好 输出是 九
  • 在 webfaction 上隐藏安全 django 设置信息

    我试图隐藏 webfaction 上 django 应用程序的数据库密码等安全信息 但我找不到如何以及在哪里使用环境变量设置这些信息 我开发了一个可以用 pip 安装的包 pip install djangosecure 在你的 setti
  • 单元测试 Angular Observables

    我是测试领域的新手 刚刚开始为现有的 Angular 2 代码编写单元测试 我有一个函数confirmDelete返回Obserable