【问题标题】:Angular 6 testing - Jasmine - mock chained promisesAngular 6 测试 - Jasmine - 模拟链式承诺
【发布时间】:2018-07-21 07:13:04
【问题描述】:

我的服务中有一个方法register(),我想测试它。我的断言是调用了注入服务的另一种方法。让我们深入了解一下我的代码:

服务

export class OAuthRegistrationService {

  constructor(private afAuth: AngularFireAuth,
              private afs: AngularFirestore) {
  }

  public register(register: RegisterDataModel): Promise<void | string> {
    return this.afAuth.auth.createUserWithEmailAndPassword(register.email, register.password)
      .then(() => {
      const user = this.afAuth.auth.currentUser;
      this.setUser(user, register).then(() =>
        user.sendEmailVerification().then(() => 'Please verify your email').catch((err) => err));
    }).catch((err: FirebaseErrorModel) => err.message);
  }
}

现在在我的单元测试中,我想断言 sendEmailVerification 已被调用。现在我需要正确地模拟上面调用的 pomises,以检查该方法是否已被调用。

规范文件/单元测试

describe('OAuthRegistrationService', () => {
  let service: OAuthRegistrationService;
  // stubs
  const afAuthStub = {
    auth: {
      sendEmailVerification(): Promise<void> {
        return new Promise<void>(resolve => resolve());
      },
      createUserWithEmailAndPassword(): Promise<void> {
        return new Promise<void>(resolve => resolve());
      },
      currentUser: {
        uid: 'blub'
      }
    }
  };

  const afsStub = {
    doc(path: string) {
      return {
        set() {
          return path;
        }
      };
    }
  }

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        {provide: AngularFireAuth, useValue: afAuthStub},
        {provide: AngularFirestore, useValue: afsStub},
        OAuthRegistrationService
      ]
    });
    service = TestBed.get(OAuthRegistrationService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should send email verification', () => {
    const register: RegisterDataModel = new RegisterDataModel('username', 'abc@email.com', 'password', null, null);

    const mock = TestBed.get(AngularFireAuth);
    const spy = spyOn(afAuthStub.auth, 'sendEmailVerification').and.callThrough();
    spyOn(afAuthStub.auth, 'createUserWithEmailAndPassword').and.callThrough();
    mock.auth = afAuthStub.auth;

      service.register(register).then(() => {
        expect(spy).toHaveBeenCalled();
    });
  });
});

Jasmines and.callTrough 允许我调用 Promise .then() 方法并进入我测试方法的下一步。但不知何故,我的控制台说:我的间谍从未被调用过。有人知道,我在这里做错了什么吗?

【问题讨论】:

    标签: angular unit-testing karma-jasmine jasmine2.0


    【解决方案1】:

    您的存根有点不正确,sendEmailVerification() 方法属于 currentUser 属性。

    const afAuthStub = {
      auth: {
        createUserWithEmailAndPassword(): Promise<void> {
          return new Promise<void>(resolve => resolve());
        },
        currentUser: {
          uid: 'blub',
          sendEmailVerification(): Promise<void> {
            return new Promise<void>(resolve => resolve());
          },
        }
      }
    };
    
    ...
    
    const spy = spyOn(afAuthStub.auth.currentUser, 'sendEmailVerification')
    

    这是一个测试通过的StackBlitz

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2014-11-16
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多