कोणीय इकाई परीक्षण में सदस्यता लेने के लिए नकली सेवा की एक विषय संपत्ति का चयन करना

Jan 19 2021

मेरी कोणीय इकाई के परीक्षण में मेरी नकली सेवा के दो गुण हैं:

  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 );

यह मेरे लिए काम क्यों नहीं करता है? मुझे एक त्रुटि प्राप्त हुई:

अपरिभाषित की संपत्ति 'सदस्यता' नहीं पढ़ सकते हैं

जवाब

1 satanTime Jan 19 2021 at 13:37

यह काम नहीं करता है क्योंकि 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.
  });
}
1 bakunet Jan 19 2021 at 14:29

मैंने दृष्टिकोण के साथ समाप्त किया, जहां मैंने इस तरह से नकली सेवा को इंजेक्ट किया:

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);