Angular 单元测试 - 模拟服务中的属性未定义

发布于 2025-01-20 16:33:28 字数 1162 浏览 1 评论 0原文

我是单位测试一个介绍组件。我正在嘲笑的服务之一具有Getter属性,用户。该组件来自另一个。在其父母的ngoninit上,Sessionservice的用户属性被访问,并且由于发现其未定义而失败。在这里尝试的另一种方法是什么?

describe('MyComponent', () => {
let component: MyComponent, fixture: ComponentFixture<MyComponent>, el: DebugElement;

beforeEach(
    waitForAsync(() => {
        const sessionService = jasmine.createSpyObj('SessionService', ['']);
        Object.defineProperty(sessionService, 'user', {
            value: of(
                new User()
            )
        });
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            imports: [...],
            providers: [                    
                { provide: SessionService, useValue: sessionService }
            ]
        })
            .compileComponents()
            .then(() => {
                fixture = TestBed.createComponent(MyComponent);
                component = fixture.componentInstance;
                el = fixture.debugElement;
            });
    })
);

it('should have prev/next buttons', () => {        
    fixture.detectChanges();
    console.log(el.nativeElement.outerHTML);
  });
});

I am unit testing a presentational component. One of its services I am mocking has a getter property, user. This component derives from another. On the ngOnInit of its parent the sessionService's user property is accessed and it fails as it finds it undefined. What's another approach to try here?

describe('MyComponent', () => {
let component: MyComponent, fixture: ComponentFixture<MyComponent>, el: DebugElement;

beforeEach(
    waitForAsync(() => {
        const sessionService = jasmine.createSpyObj('SessionService', ['']);
        Object.defineProperty(sessionService, 'user', {
            value: of(
                new User()
            )
        });
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            imports: [...],
            providers: [                    
                { provide: SessionService, useValue: sessionService }
            ]
        })
            .compileComponents()
            .then(() => {
                fixture = TestBed.createComponent(MyComponent);
                component = fixture.componentInstance;
                el = fixture.debugElement;
            });
    })
);

it('should have prev/next buttons', () => {        
    fixture.detectChanges();
    console.log(el.nativeElement.outerHTML);
  });
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岁月染过的梦 2025-01-27 16:33:29

在这种情况下,您始终可以创建一个模拟类,而不是 jasmine.createSpyObj。我以前从未模拟过 getters,但我认为有时去模拟类比 jasmine.createSpyObj 更好。

试试这个:

class MockSessionService {
  get user() {
    return of(new User());
  }
}
....
providers: [{ provide: SessionService, useClass: MockSessionService }]

You can always create a mock class in this case instead of a jasmine.createSpyObj. I have never mocked getters before but I think sometimes it is better to go to mock class than jasmine.createSpyObj.

Try this:

class MockSessionService {
  get user() {
    return of(new User());
  }
}
....
providers: [{ provide: SessionService, useClass: MockSessionService }]
别挽留 2025-01-27 16:33:29

尝试以最简单的方式定义你的存根

    const sessionService = {
        user:of(new User());
     }

Try to define your stub simplest way possible

    const sessionService = {
        user:of(new User());
     }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文