कोणीय इकाई परीक्षण में सदस्यता लेने के लिए नकली सेवा की एक विषय संपत्ति का चयन करना
मेरी कोणीय इकाई के परीक्षण में मेरी नकली सेवा के दो गुण हैं:
public messageChange: Subject<ChatMessage> = new Subject<ChatMessage>();
public gameChange: Subject<GameState> = new Subject<GameState>();
और मेरे SUT में मैं उन्हें अपने निर्माता में उपयोग करता हूं:
this._subChat = this.hub.messageChange.subscribe((message: ChatMessage) => {
this.message = message;
this.messageChange.next(this.message);
});
this._subGame = this.hub.gameChange.subscribe((game: GameState) => {
this.game.setGame(game);
});
अभी मैं इन 2 तरीकों का उपयोग नकली सेवा से नकली गुणों के लिए करने की कोशिश कर रहा हूँ:
- कोणीय इकाई परीक्षण मॉक रीप्ले विषय
- कैसे जैस्मीन के साथ एक मूल्य संपत्ति (एक विधि के बजाय) जासूसी करने के लिए
रिहैट अब मेरा परीक्षण इस तरह दिखता है:
describe('SignalRService', () => {
let signalrService: SignalRService;
const hubServiceMock = jasmine.createSpyObj('HubConnectionService', [
'isConnectionStarted',
]);
const messageChange = new Subject();
const gameChange = new Subject();
beforeEach(() => {
signalrService = new SignalRService(
hubServiceMock
);
let msg = {} as ChatMessage;
let gam = {} as GameState;
messageChange.next(msg);
gameChange.next(gam);
});
it('Service_ShouldBeCreated', () => {
spyOnProperty(hubServiceMock, 'messageChange', 'get').and.returnValue(
messageChange
);
spyOnProperty(hubServiceMock, 'gameChange', 'get').and.returnValue(
gameChange
);
expect(signalrService).toBeTruthy();
});
}
इसलिए मेरे द्वारा बनाई गई परीक्षा में:
सेवा नकली
hubServiceMock
,नकली
messageChange = new Subject();
,नकली
gameChange = new Subject();
,मैं दोनों के लिए दौड़ता हूं
.next
,और मैं संपत्तियों के लिए जासूसी सेटअप:
spyOnProperty(hubServiceMock, 'messageChange', 'get').and.returnValue( messageChange );
spyOnProperty(hubServiceMock, 'gameChange', 'get').and.returnValue( gameChange );
यह मेरे लिए काम क्यों नहीं करता है? मुझे एक त्रुटि प्राप्त हुई:
अपरिभाषित की संपत्ति 'सदस्यता' नहीं पढ़ सकते हैं
जवाब
यह काम नहीं करता है क्योंकि hubServiceMock
इसमें नकली विषय नहीं हैं messageChange
और gameChange
, आपको कॉल करने से पहले उन्हें सेट करने की आवश्यकता है new SignalRService(hubServiceMock)
।
const hubServiceMock = jasmine.createSpyObj('HubConnectionService', [
'isConnectionStarted',
]);
const messageChange = new Subject();
const gameChange = new Subject();
// add this
hubServiceMock.messageChange = messageChange;
hubServiceMock.gameChange = gameChange;
तो यह काम करना चाहिए, शायद छोटे समायोजन की जरूरत है।
मैं दर्द से बचने के लिए ऐसे मामलों के लिए मज़ाक करने वाले काम का उपयोग करने का सुझाव दूंगा।
एनजी-मोक्स के साथ उदाहरण के लिए , परीक्षण ऐसा लग सकता है:
describe('SignalRService', () => {
beforeEach(() => MockBuilder(SignalRService, ITS_MODULE));
const hubServiceMock = {
messageChange: new Subject(),
gameChange: new Subject(),
};
beforeEach(() => MockInstance(HubConnectionService, hubServiceMock));
it('Service_ShouldBeCreated', () => {
const signalrService = MockRender(SignalRService).point.componentInstance;
expect(signalrService).toBeTruthy();
hubServiceMock.messageChange.next({});
hubServiceMock.gameChange.next({});
// next assertions.
});
}
मैंने दृष्टिकोण के साथ समाप्त किया, जहां मैंने इस तरह से नकली सेवा को इंजेक्ट किया:
hubServiceMock = TestBed.inject(HubConnectionService);
फिर मैं Subject
इस तरह अपना मजाक उड़ाता हूं :
it('Service_ShouldBeCreated', () => {
spyOn(hubServiceMock.messageChange, 'next');
spyOn(hubServiceMock.gameChange, 'next');
expect(signalrService).toBeTruthy();
});
और अन्य परीक्षणों में मैं इस तरह से नकली सेवा के तरीकों का उपयोग कर सकता हूं:
let spyIsConnectionStarted = spyOn(hubServiceMock, 'isConnectionStarted');
spyIsConnectionStarted.and.returnValue(true);