I have an error in my Karma tests in my Angular application. The error is when I run my tests:
Failed: Property activePropertyChanged does not have access type get
I'm trying to mock a service called ModuleSpecService
. In this service there's the following getter:
get activePropertyChanged(): Observable<SpecificationPropertyObject> {
return this.activePropChangedSubject.asObservable();
}
And in my spec
file I mock it like this:
spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of());
// then, in configureTestingModule() I define/mock the service like this:
providers: [{ provide: ModuleSpecService, useValue: moduleSpecServiceMock }]
So there's clearly a getter in my service which I want to mock. If I remove the line with spyOnProperty()
it throws the following error:
TypeError: this.moduleSpecService.activePropertyChanged.subscribe is not a function
so I definitely need the mock.
Any idea what could go wrong?
You can use the spread syntax:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
const moduleSpecServiceMock = {
...jasmine.createSpyObj('moduleSpecServiceMock ', ['']),
activePropertyChanged: of()
} as jasmine.SpyObj;
This allows you to set private properties and getters without the need for as any
syntax.
One great benefit of this is that if you refactor the getter name then the test property will also update, with the as any
syntax you lose the typings and ability to refactor.
Since this seems to be a bug in jasmine I managed to fix this with a workaround:
Instead of this:
spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of());
I defined the property like this:
(moduleSpecServiceMock as any).activePropertyChanged = of();
I had to cast it as any
, because if not, it (correctly) told me that activePropertyChange
is a read-only
property (since it has only a getter).
Not the best solution, but at least it works :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With