【问题标题】:Dart Angular replacing provider with mock in unit testingDart Angular 在单元测试中用模拟替换提供者
【发布时间】:2017-03-19 13:20:30
【问题描述】:

如何在 Angular Dart 单元测试中将提供程序 QuizService 替换为 QuickServiceMock

我尝试使用addProviders 方法,但没有将QuizService 替换为QuizkServiceMock

似乎MultipleChoiceQuizComponent 仍在使用原始类QuizkService 而不是QuizServiceMock,就像我想要的那样。

import 'dart:html';
import 'package:angular2/angular2.dart';
import 'package:angular_test/angular_test.dart';
import 'package:test/test.dart';
import 'package:mockito/mockito.dart';

import '...quiz_service.dart';
import '...multiple_choice_quiz_component.dart';
import '...multiple_choice_quiz.dart';

class MockQuizService extends Mock implements QuizService {}

@AngularEntrypoint()
void main()
{
    group('$MultipleChoiceQuizComponent', () {
        MockQuizService quizServiceMock;
        setUp(() async {
            quizServiceMock = new MockQuizService();
            List<String> mockChoiceList = [
                "incorrect1",
                "incorrect2",
                "correct answer",
                "incorrect3"
            ];
            when(quizServiceMock.getQuiz())
                .thenReturn(
                    new MultipleChoiceQuiz(
                        mockChoiceList,
                        "correct answer",
                        'test question description'
                )
            );
        });

        test('should add "incorrect" css class to incorrect answer', () async {
            NgTestBed bed = new NgTestBed<MultipleChoiceQuizComponent>().addProviders([
                provide(QuizService, useValue: quizServiceMock)
            ]);
            NgTestFixture fixture = await bed.create();
            Element answer = fixture.rootElement.querySelector('.quiz-choice:nth-child(2)');
            answer.dispatchEvent(new MouseEvent('click'));
            bool hasClass = answer.classes.contains('incorrect');
            expect(hasClass, true);
        });
    });

}

multiple_choice_quiz_component.dart:

import 'package:angular2/core.dart';
import 'package:angular2/common.dart';
import 'package:angular2_components/angular2_components.dart';

import '.../quiz/quiz.dart';
import '.../service/quiz_service.dart';

@Component
(
    selector: 'multiple-choice-quiz-component',
    directives: const [materialDirectives, NgFor],
    providers: const [materialProviders, QuizService],
    templateUrl: 'multiple_choice_quiz_component.html',
    styleUrls: const['/app_component.css', 'quiz.css']
)

class MultipleChoiceQuizComponent
{
    String selectedAnswer;
    String description;
    bool correctAnswer = false;
    Quiz quiz;

    MultipleChoiceQuizComponent(QuizService quizService)
    {
        this.quiz = quizService.getQuiz();
    }

    void onSelect(String answer)
    {
        selectedAnswer = answer;
        this.correctAnswer = this.quiz.isAnswer(answer);
    }
}

我错过了什么?

【问题讨论】:

  • 您是否在MultipleChoiceQuizComponent 中提供QuizkService? (或AppComponentbootstrap(AppCompoennt, [...])
  • @GünterZöchbauer 在MultipleChoiceQuizComponent提供服务
  • TestBed 好像不支持替换组件的提供者。
  • 该死,我以为addProviders 就是这么做的:(
  • 在我看来,addProviders 允许在被测组件的父级提供服务。

标签: unit-testing angular mocking dart mockito


【解决方案1】:

您不能在小部件的@Component 注释中覆盖providers:

您可以做的是将绑定移到树中更高的位置,以便父(或应用引导程序)提供绑定。

【讨论】:

  • 我已将组件代码添加到我的问题中。我不确定您将绑定移高是什么意思。
  • 不是将QuizService 放在组件上的providers 中,而是将其放在对bootstrap 的调用中的提供程序中吗? “在树中较高”是指在 DOM 树中较高的组件的提供者中,或者在作为 DI 树的根的引导程序中
  • @Nate 太糟糕了,它违反了 Angular 最佳实践 webdev.dartlang.org/angular/guide/…
  • @Tek - 每个MultipleChoiceQuizComponent 都需要它自己的QuizService 实例吗?这就是您链接的指南中讨论的情况。如果是这种情况,那么我建议您不要在测试中模拟 QuizService。
  • @Nate 啊,好的。它不需要它自己的实例......现在。虽然我仍然不明白如何模拟服务以使我的测试通过。
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 2015-03-04
  • 1970-01-01
  • 2013-09-20
  • 2015-04-03
  • 2010-09-10
  • 2020-05-01
  • 2019-05-15
相关资源
最近更新 更多