Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在角业茉莉花测试中模拟服务_Angular_Typescript_Unit Testing_Jasmine_Karma Jasmine - Fatal编程技术网

Angular 在角业茉莉花测试中模拟服务

Angular 在角业茉莉花测试中模拟服务,angular,typescript,unit-testing,jasmine,karma-jasmine,Angular,Typescript,Unit Testing,Jasmine,Karma Jasmine,我试图通过将服务添加到规范中的providers数组并使用其函数添加createSpyObj来模拟服务,但出现以下错误: 从源代码“http:localhost:9876”访问位于ng://DynamicTestModule/mycomponent_Host.ngfactory.js的XMLHttpRequest 我做错了什么 //。。。。导入服务 假设您有一个名为SharedService的服务要测试 //从所需位置导入服务,我刚才用@ 从@services导入{SharedService}

我试图通过将服务添加到规范中的providers数组并使用其函数添加createSpyObj来模拟服务,但出现以下错误:

从源代码“http:localhost:9876”访问位于ng://DynamicTestModule/mycomponent_Host.ngfactory.js的XMLHttpRequest

我做错了什么

//。。。。导入服务


假设您有一个名为SharedService的服务要测试

//从所需位置导入服务,我刚才用@ 从@services导入{SharedService} //在描述中创建一个实例 让共享服务:共享服务 //在提供程序下声明beforeach 提供者:[共享服务] //创建组件和测试夹具 fixture=TestBed.createComponentyourComponentName; 组件=fixture.componentInstance; sharedService=fixture.debugElement.injector.getSharedService //仅当您未使用webpack或angular CLI时才使用compileComponents 它'应该调用MethodOne-sharedService==>resolved',=>{ 让MockedData={}; spyOnsharedService、“someMethod”和.returnValueObservable.of MockedData; 方法一; expectsharedService.someMethod.ToHaveCalled; };
我要做的是提供服务,但利用Angular的HttpClientTestingModule和HttpTestingController来配置每个单元测试的单独http响应

beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports: [],
        providers: [SharedService]
    }).compileComponents();
}));
一旦提供了服务,您就可以访问其中的所有内容

本质上,您可以创建模拟响应,并为您编写的每个测试通过测试套件“刷新”它们。这使您能够为每个测试配置HTTP响应,而不是为整个服务测试套件提供一个响应

下面是一个例子:

it("should return valid response", fakeAsync(
   inject([HttpTestingController], (httpMock: HttpTestingController) => {
      let mockResponse = { success: true }

      httpMock.expectOne('endpoint name here').flush(mockResponse);

      fixture.whenStable().then(() => {
          //here's your acceptance criteria
      });
   });
));
这里有一些相关文档:

您创建spy本身的方式是错误的。从错误来看,它似乎与无效导入或其他内容更相关

正确的方法是:

describe("UserDetailComponent", () => {
  let component: UserDetailComponent;
  let fixture: ComponentFixture<UserDetailComponent>;
  const mockUserService = jasmine.createSpyObj("UserSvcService", ["getUserDetail"]);

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [UserDetailComponent],
      providers: [
        { provide: UserSvcService, useValue: mockUserService }
      ]
    }).compileComponents();
  }));
....
...
 it('should set some values using service',()=>{
   mockUserService.getUserDetail.and.returnValue(
      of({ data: 'somevalue'})
    );
   expect(someCondition).toBeDefined();
 })
)}


还有其他方法可以做到这一点,使用存根,然后使用useClass插入组件

您正在导入myService吗?你能分享整个错误信息吗?谢谢,但问题是另外的,我自己解决了
describe("UserDetailComponent", () => {
  let component: UserDetailComponent;
  let fixture: ComponentFixture<UserDetailComponent>;
  const mockUserService = jasmine.createSpyObj("UserSvcService", ["getUserDetail"]);

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [UserDetailComponent],
      providers: [
        { provide: UserSvcService, useValue: mockUserService }
      ]
    }).compileComponents();
  }));
....
...
 it('should set some values using service',()=>{
   mockUserService.getUserDetail.and.returnValue(
      of({ data: 'somevalue'})
    );
   expect(someCondition).toBeDefined();
 })
)}