【发布时间】:2017-05-23 02:09:52
【问题描述】:
如何对这个登录功能进行单元测试,特别是 http post 部分?我制作的 http 模拟未正确编码以进入代码的“if...else”部分。我不想使用 TestBed。 TestBed 太慢了。
login(username: string, password: string): Observable<boolean> {
const headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('accept', 'application/json');
let options = new RequestOptions({ headers: headers });
return this.http.post('https://blah/api/login',
JSON.stringify({ username: username, password: password }), options)
.map((response: Response) => {
const token = response.json() && response.json().access_token;
if (token) {
this.token = token;
localStorage.setItem('currentUser', JSON.stringify({ username: username, token: token }));
return true;
} else {
return false;
}
}).catch(this._serverError);
}
private _serverError(err: any) {
return Observable.throw(err || 'backend server error');
}
下面是我正在尝试的 Jasmine 测试:我需要有关此行的帮助。
spyOn(mockHttp,'post').and.returnValue(Observable.of(response));
我的 returnValue 应该是什么才能让我进入登录函数中的“if...else”代码?
describe('AuthenticationService', () => {
let service: AuthenticationService;
let mockHttp = null;
beforeEach(() => {
mockHttp = {};
mockHttp.post = function(){};
service = new AuthenticationService(mockHttp);
});
it(`should set access token in local storage for successful login`,() => {
const access_token = 'blah83balc380';
const responseOptions = new ResponseOptions();
responseOptions.status = 200;
responseOptions.body = {access_token:access_token};
const username = 'test';
const currentUserExpected = JSON.stringify({ username: username, token: access_token });
var response = new Response(responseOptions);
spyOn(mockHttp,'post').and.returnValue(Observable.of(response));
service.login(username, 'test');
var currentUser = localStorage.getItem('currentUser');
expect(currentUserExpected).toEqual(currentUser);
});
});
【问题讨论】:
-
是什么让你想做这样的事情?它需要您模拟
json()函数等。这很麻烦。由于您无法处理它,这可以被认为是使用 TestBed 进行测试的证明。顺便说一句,代码格式错误,问题不可读。 -
@estus TestBed 测试很慢。使用 TestBed 运行 100 个测试需要多长时间?太长。这就是为什么我不想使用 TestBed 除非绝对必要。使用 TestBed 进行测试并不优越。您的评论无用且无益。
-
如果您不欣赏它,这不会使评论毫无用处。如果不提供全面覆盖,100 次测试的效率如何?您可以使用 TestBed 正确测试 DI。没有它你不能这样做。甚至没有提及您在问题中遇到性能问题...等等,有提及,但由于格式错误,它不可见。
-
@Maxime 谢谢!那篇文章是一个很好的总结,正是我所需要的
标签: angular unit-testing typescript jasmine rxjs