2016-09-26 6 views
0

Я пытаюсь реализовать Specflow для goo geo-кода api, однако я неоднократно получаю System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. и RootObject всегда имеет значение null. Может кто-нибудь мне помочь? ниже мое определение ШагC# Specflow Ссылка на объект не установлена ​​в экземпляр объекта в

namespace NUnit.Tests1.StepDefinition 
{ 
[Binding] 
public sealed class GoogleSteps 
{ 
    private string googleapiurl; 
    private RootObject root = new RootObject(); 

    [Given(@"Google api that takes address and returns latitude and longitude")] 
    public void GivenGoogleApiThatTakesAddressAndReturnsLatitudeAndLongitude() 
    { 
     googleapiurl = "http://maps.googleapis.com/maps/api/geocode/json?address="; 
    } 

    [When(@"The client Gets response by ""(.*)""")] 
    public async Task WhenTheClientGetsResponseBy(string addr) 
    { 
     HttpClient cl = new HttpClient(); 

     StringBuilder sb = new StringBuilder(); 
     sb.Append(googleapiurl); 
     sb.Append(addr); 
     Uri uri = new Uri(sb.ToString()); 
     var response = await cl.GetStringAsync(uri);  
     root = JsonConvert.DeserializeObject<RootObject>(response); 

    } 

    [Then(@"The ""(.*)"" and ""(.*)"" returned should be as expected")] 
    public void ThenTheAndReturnedShouldBeAsExpected(string exp_lat, string exp_lng) 
    { 
     var location = root.results[0].geometry.location; 
     var latitude = location.lat; 
     var longitude = location.lng; 
     Console.WriteLine("Testing upali"); 
     Console.WriteLine("location: lat " + location.lat); 
     Console.WriteLine("location: long " + location.lng); 
     Assert.AreEqual(location.lat.ToString(), exp_lat); 
     Assert.AreEqual(location.lng.ToString(), exp_lng); 
    } 

} 

}

Ответ Json является:

{ 
"results": [ 
{ 
"address_components": [ 
{ 
"long_name": "1600", 
"short_name": "1600", 
    "types": [ 
     "street_number" 
     ] 
    }, 
    { 
     "long_name": "Amphitheatre Parkway", 
     "short_name": "Amphitheatre Pkwy", 
     "types": [ 
     "route" 
     ] 
    }, 
    { 
     "long_name": "Mountain View", 
     "short_name": "Mountain View", 
     "types": [ 
     "locality", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "Santa Clara County", 
     "short_name": "Santa Clara County", 
     "types": [ 
     "administrative_area_level_2", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "California", 
     "short_name": "CA", 
     "types": [ 
     "administrative_area_level_1", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "United States", 
     "short_name": "US", 
     "types": [ 
     "country", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "94043", 
     "short_name": "94043", 
     "types": [ 
     "postal_code" 
     ] 
    } 
    ], 
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", 
    "geometry": { 
    "location": { 
     "lat": 37.4223329, 
     "lng": -122.0844192 
    }, 
    "location_type": "ROOFTOP", 
    "viewport": { 
     "northeast": { 
     "lat": 37.4236818802915, 
     "lng": -122.0830702197085 
     }, 
     "southwest": { 
     "lat": 37.4209839197085, 
     "lng": -122.0857681802915 
     } 
    } 
    }, 
    "place_id": "ChIJ2eUgeAK6j4ARbn5u_wAGqWA", 
    "types": [ 
    "street_address" 
    ] 
    } 
    ], 
"status": "OK" 
} 

И мой класс RootObject, как показано ниже:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace NUnit.Tests1.GoogleAPI 
{ 
public class RootObject 
{ 
    public List<Result> results { get; set; } 
    public string status { get; set; } 
} 
} 

Результат StackTrace:

Test Name: VerifyLatitudeAndLongitude 
Test FullName:   NUnit.Tests1.FeatureFiles.GoogleGeoCodeFeature.VerifyLatitudeAndLongitude 
Test Source: C:\Users\nandyu\documents\visual studio 
2015\Projects\NUnit.Tests1\NUnit.Tests1\FeatureFiles\GoogleGeoCode.feature :  
line 5 
Test Outcome: Failed 
Test Duration: 0:00:00.069 

Result StackTrace: 
at 
    NUnit.Tests1.StepDefinition.GoogleSteps.ThenTheAndReturnedShouldBeAsExpected(String exp_lat, String exp_lng) in C:\Users\nandyu\documents\visual studio 2015\Projects\NUnit.Tests1\NUnit.Tests1\StepDefinition\GoogleSteps.cs:line 42 
at lambda_method(Closure , IContextManager , String , String) 
at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding,  
IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) 
at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) 
at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) 
at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() 
at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() 
at NUnit.Tests1.FeatureFiles.GoogleGeoCodeFeature.ScenarioCleanup() 
at 
NUnit.Tests1.FeatureFiles.GoogleGeoCodeFeature.VerifyLatitudeAndLongitude() 
in C:\Users\nandyu\documents\visual studio 
    2015\Projects\NUnit.Tests1\NUnit.Tests1\FeatureFiles\GoogleGeoCode.feature:line 8 
Result Message: System.NullReferenceException : Object reference not set to an instance of an object. 
+0

Непонятно, что вы имеете в виду под ", а для объекта" root "устанавливается значение null при запуске этого кода, но нет ошибки, когда строка" root = JsonConvert.DeserializeObject (response); "выполняется" - и могли бы вы предоставить трассировку стека, пожалуйста? Мы не можем сказать, где именно генерируется исключение. Любая диагностика, которую вы получили, тоже будет полезна ... –

+0

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a -nullreferenceexception-and-how-do-i-fix-it) – HimBromBeere

+1

Как выглядит ваш объект «Результат»; что более важно, соответствует ли это результату в json - кажется, что это скорее случай десериализации, который не происходит. – Darren

ответ

0

Ваша проблема, скорее всего, что вы сделали свой шаг async, когда это не поддерживается specflow, так что ваш метод

public async Task WhenTheClientGetsResponseBy(string addr)

вероятно возвращение на этой линии:

var response = await cl.GetStringAsync(uri); 

и specflow не ждет ответа на задание, поэтому он переходит к следующему шагу, а затем ваш root.results[0] не настроен ни на что, поэтому исключение нулевой ссылки

1

Sam Holder, вы правы,

Я изменил код:

var response = await cl.GetStringAsync(uri); 

To:

response = cl.GetStringAsync(uri).Result; 

Это решило мою проблему.