2017-02-09 10 views
1

Я немного борюсь с одним из моих тестов.Результат задания MStest:

Вот код, я тестирую

public async Task Handle(ReceiveEventsFromSalesForceCommand message, IMessageHandlerContext context) 
{ 
    var queryResult = await this.GenerateQueryResultAsync(message).ConfigureAwait(false); 

    await this.DetermineActionAsync(context, queryResult).ConfigureAwait(false); 
} 

public async Task<QueryResult<EventStore__c>> GenerateQueryResultAsync(ReceiveEventsFromSalesForceCommand message) 
{ 
    QueryResult<EventStore__c> queryResult; 
    if (string.IsNullOrWhiteSpace(message.NextRecordsUrl)) 
     { 
      queryResult = await this.forceClient.QueryAsync<EventStore__c>(query).ConfigureAwait(false); 
      this.log.Info($"AFTER: QueryAllAsync<EventStore>(query), found {queryResult?.TotalSize ?? 0} records"); 
     } 
     else 
     { 
      queryResult = await this.forceClient.QueryContinuationAsync<EventStore__c>(message.NextRecordsUrl).ConfigureAwait(false); 
      this.log.Info("AFTER: QueryContinuationAsync<EventStore>(query)"); 
     } 
    return queryResult; 
} 

И это мой блок тест

[TestMethod] 
    public async Task Test() 
    { 
     // arrange 
     var forceConfig = Substitute.For<ISalesForceCreationHandlerConfig>(); 
     var forceClient = Substitute.For<IForceClient>(); 
     forceClient.QueryAllAsync<EventStore__c>(Arg.Any<string>()).Returns(Task.FromResult(new QueryResult<EventStore__c> { NextRecordsUrl = "Dummy" })); 
     var messageHandlerContext = Substitute.For<IMessageHandlerContext>(); 
     var handler = new SalesForceBatchCreationHandler(forceClient, null, forceConfig); 

     // act 
     await handler.Handle(new ReceiveEventsFromSalesForceCommand(), messageHandlerContext); 

     // assert 
     await messageHandlerContext.Received().Send(Arg.Is<ReceiveEventsFromSalesForceCommand>(command => string.IsNullOrWhiteSpace(command.NextRecordsUrl)), Arg.Any<SendOptions>()); 
     await messageHandlerContext.DidNotReceive().SendLocal(Arg.Any<PublishMultipleKlantManagementEnvelopeCreatedEventsCommand>()); 
    } 

Моя проблема заключается в том, что iresult моего GenerateQueryResultAsync метода null и я получаю NullReferenceException. Как я могу убедиться, что результат не является нулевым и исключает исключение?

+1

Сторона примечания: в вашем первом методе 'Handle' было бы более эффективно опускать async/await. Просто верните задачу напрямую, так как нет причин ждать ее завершения в этом методе (если только в этом методе нет того, что вы не показываете). – Igor

+1

Есть ли причина, по которой это не должно быть закрыто как дубликат http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it? Что делает ваш случай особенным, что вы не можете просто иметь ненулевое значение там, где оно вам нужно? – nvoigt

+1

Вы используете NSubstitute 1.9.0 или новее? Похоже, вы завершаете 'QueryAllAsync', но SUT вызывает' QueryAsync'. –

ответ

0

Реструктурируйте способ совершения асинхронных вызовов. Скорее всего, это преступник {queryResult.TotalSize}.

public async Task<QueryResult<EventStore__c>> GenerateQueryResultAsync(ReceiveEventsFromSalesForceCommand message) { 
    QueryResult<EventStore__c> queryResult; 
    if (string.IsNullOrWhiteSpace(message.NextRecordsUrl)) { 
     queryResult = await this.forceClient.QueryAsync<EventStore__c>(query).ConfigureAwait(false); 
     this.log.Info($"AFTER: QueryAllAsync<EventStore>(query), found {queryResult?.TotalSize ?? 0} records"); 
    } else { 
     queryResult = await this.forceClient.QueryContinuationAsync<EventStore__c>(message.NextRecordsUrl).ConfigureAwait(false); 
     this.log.Info("AFTER: QueryContinuationAsync<EventStore>(query)"); 
    } 
    return queryResult; 
} 
+0

Я отредактировал метод handle, мне нужен queryresult как вход для другого метода. queryResult.TotalSize действительно был виновником. Но возвращаемый queryresult теперь имеет значение null. У меня такое чувство, что я пропускаю какую-то конфигурацию в своем модульном тесте? –

+0

@RonaldRozema, вам необходимо просмотреть/отладить метод 'forceClient.QueryAsync', чтобы узнать, почему он возвращает null. Что-то в этом методе приводит к возврату нулевого результата. – Nkosi

Смежные вопросы