2016-05-27 26 views
0

Ich bin in diese wirklich seltsame Situation gestoßen, in der bestimmte Tests fehlschlagen (etwa 7 von ihnen), wenn ich alle meine Tests zusammen durchführe. Aber wenn ich nur die Tests in der Klasse durchführe (sie gehören alle zur selben Klasse), dann bestehen sie. Das Testprojekt ist ein Windows Phone 8.1 MSTest, und ich habe versucht, es sowohl mit Resharper Test Runner und MSTest Test Runner und sie beide zeigen das gleiche Problem. Hier ist mein TestInitialize Code:MSTest-Tests gelingen, wenn sie isoliert ausgeführt werden, scheitern, wenn sie mit anderen Tests ausgeführt werden

[TestInitialize] 
public void Init() 
{ 
    ResolveDependencies(); 
    var adsApiService = ServiceLocator 
     .Current 
     .GetInstance<IApiService<ListAdsReply, PublicAdsEndPoint>>();    
    var navigationService = new NavigationServiceMock(); 
    var mainPageTrackingService = ServiceLocator 
     .Current 
     .GetInstance<IMainPageTrackingService>(); 
    var adInsertionTrackingService = ServiceLocator 
     .Current 
     .GetInstance<IAdInsertionTrackingService>(); 
    var connectionService = ServiceLocator 
     .Current 
     .GetInstance<IConnectionService>(); 
    _windowsApiService = new WindowsApiServiceMock(); 
    var contactAboutTrackingService = ServiceLocator 
     .Current 
     .GetInstance<IContactAboutTrackingService>(); 
    var filtersTrackingService = ServiceLocator 
     .Current 
     .GetInstance<IFiltersTrackingService>(); 
      var filtersService = ServiceLocator 
     .Current 
     .GetInstance<IFiltersService>(); 
    var messageHelperMock = new MessageHelperMock(); 
    _mainPageViewModel = new MainPageViewModel(adsApiService, navigationService, mainPageTrackingService, adInsertionTrackingService, connectionService, _windowsApiService, contactAboutTrackingService,filtersTrackingService, filtersService, messageHelperMock); 
} 

Die ResolveDependencies Methode alles tun, keine speziellen neben Abhängigkeiten in einem Unity Container Registrierung Registrierung mit ServiceLocator.SetLocatorProvider und einige AutoMapper Konfigurationen zu tun. Kein Async-Code dort.

[TestMethod] 
public async Task GivenParameterIsProvidedThenFetchDataShouldReturnValidData() 
{ 
    _mainPageViewModel 
     .SearchParams 
     .Add(new KeyValuePair<string, string>("lim", "5")); 
    var searchParams = _mainPageViewModel.SearchParams; 
    await _mainPageViewModel.FetchData(searchParams); 

    var list = _mainPageViewModel.AdsList; 
    Assert.IsNotNull(list); 
} 

Dies ist einer der fehlgeschlagenen Tests.

public async Task<ListAdsReplyViewModel> FetchData(List<KeyValuePair<string, string>> parameters) 
{ 
    _cancellationTokenSource = new CancellationTokenSource(); 

    _cancellationTokenSource 
     .CancelAfter(Constants.TimeToCancelAsyncOperations); 
    AddSearchKeywordToSearchParams(); 
    var result = await _listAdsReplyApiService 
     .GetWithParametersAsync(_cancellationTokenSource, parameters); 
    var vm = new ListAdsReplyViewModel 
    { 
     Ads = new List<AdInfoViewModel>() 
    }; 
    foreach (var listAd in result.ListAds) 
    { 
     var listAdDto = Mapper.Map<ListAdDto>(listAd); 
     var adInfo = new AdInfoViewModel(_navigationService, _mainPageTrackingService) 
     { 
      ListAdDto = listAdDto 
     }; 
      vm.Ads.Add(adInfo); 
    } 
    vm.NextPage = result.NextPage; 
    vm.ConfigEtag = result.ConfigEtag; 
    vm.Sorting = result.Sorting; 
    TotalAds = result.ListAdsCounterMap.AllAds; 
    return vm; 
} 

private void AddSearchKeywordToSearchParams() 
{ 
    if (!string.IsNullOrEmpty(SearchKeyWord)) 
    { 
     var searchKeyword = SearchParams 
      .FirstOrDefault(x => x.Key == "q"); 
     if (!searchKeyword.Equals(null)) 
      SearchParams.Remove(searchKeyword); 
     SearchParams.Add(new KeyValuePair<string, string>("q", SearchKeyWord)); 
    } 
} 

Und das sind die Methoden im Test. Das Problem scheint zu passieren, wenn foreach((var listAd in result.ListAds) aufgerufen wird. Es ist wie GetWithParametersAsync(_cancellationTokenSource, parameters); abgewartet nicht zu werden, weil ich die folgende Fehlermeldung für die Prüfungen nicht erhalten:

Test method App.Tests.Integration.App.Shared.ViewModels.MainPageViewModelTests.GivenParameterIsProvidedThenFetchDataShouldReturnValidData threw exception: 
AutoMapper.AutoMapperMappingException: 

Mapping types: 
ListAd -> ListAdDto 
Core.Api.Models.PublicAds.ListAd -> Core.Dto.ListAdDto 

Destination path: 
ListAdDto 

Source value: 
Core.Api.Models.PublicAds.ListAd ---> System.NullReferenceException: Object reference not set to an instance of an object. 

    at Core.Bootstrap.AutoMapperConfiguration.<>c__DisplayClass0_0.<Configure>b__12(ListAd src, ListAdDto dest) 
    at AutoMapper.Internal.MappingExpression`2.<>c__DisplayClass57_0.<AfterMap>b__0(Object src, Object dest) 
    at AutoMapper.TypeMap.<get_AfterMap>b__40_0(Object src, Object dest) 
    at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.Map(ResolutionContext context, IMappingEngineRunner mapper) 
    at AutoMapper.Mappers.TypeMapMapper.Map(ResolutionContext context, IMappingEngineRunner mapper) 
    at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) 
--- End of inner exception stack trace --- 
    at App.ViewModels.MainPageViewModel.<FetchData>d__34.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at App.Tests.Integration.App.Shared.ViewModels.MainPageViewModelTests.<GivenParameterIsProvidedThenFetchDataShouldReturnValidData>d__7.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 

Irgendwelche Gedanken?

+0

Schaltet dies, wenn Sie andere Tests ausführen oder nur wenn eine bestimmte ausgeführt wird? (Ist es irgendeine Kombination von Tests, die den Zusammenbruch verursacht oder ist es nur eine bestimmte Kombination/bestimmter Test, die das Problem manifestieren?) Zweitens, haben Sie den Debugger angezündet und die Schritte verfolgt, um zu sehen, wo etwas schief läuft ? Die Ausnahme besagt, dass Sie einen Nullref-Fehler haben. Es sieht auch so aus, als ob es mit Auto-Mapper zu tun haben könnte. Probieren Sie es aus. – Becuzz

+0

Haben Sie berücksichtigt, dass MSTest Ihre Tests multi-threaded ausführen wird - und dass Sie durch Ausführen eines einzelnen Tests einen einzelnen Thread erzwingen? Seien Sie sehr vorsichtig, dass alle Ihre Tests UNIT-Tests sind und keine Abhängigkeiten voneinander in der Reihenfolge der Ausführung oder der Möglichkeit, dass freigegebene Ressourcen bereits instanziiert wurden (oder gerade im Prozess der Instanziierung sind) durch andere parallel ablaufende Tests bestehen . – PhillipH

+0

@Becuzz die Tests brechen, wenn ich den ganzen Haufen (mehr als 400 Tests laufen, habe ich Einheit und Integration Tests). Wenn ich nur die Tests durchführe, die scheitern, die zufällig in der gleichen Klasse sind, dann bestehen sie. PhillipH hat einen Punkt, es sieht so aus, als würden die Tests Multi-Threading ausführen, aber der Code, der ListAdDto zuordnet, wird ausgeführt und nicht erwartet wie er sollte, also wird die NullRef-Ausnahme geworfen. –

Antwort

2

Da dies in den Kommentaren akzeptiert wurde, habe ich als Antwort reposted;

"Haben Sie berücksichtigt, dass MSTest Ihre Tests multi-threaded ausführen wird - und dass Sie bei der Ausführung eines einzelnen Tests einen einzelnen Thread erzwingen? Seien Sie sehr vorsichtig, dass alle Tests UNIT-Tests sind und keine Abhängigkeiten haben einander, in der Reihenfolge der Ausführung, oder die Möglichkeit, dass freigegebene Ressourcen bereits instanziiert wurden (oder im Prozess der Instanziierung sind) durch andere parallel laufende Tests. "

Verwandte Themen