2016-08-03 4 views
0

Вот мой тестовый контроллер метод класса, который будет инициализировать фальшивый класссталкивается проблема при Тринге поддельного метода в классе

public void InitializeFake() 
{ 
    fakeHttpSession = A.Fake<HttpSessionStateBase>(); 
    fakeHttpContext = A.Fake<HttpContextBase>(); 
    nmsFake = A.Fake<INMSPlatformClient>(); 

    isFakeInitialized = true; 
    fakeHttpSession.Contents["NMCSession"] = new NMCSession() 
    { 
     DefaultOrganizationUID = 1, 
     FirstName = "system", 
     Login = "sys.admin", 
     LastName = "Admin", 
     IsMultiAccountViewable = true, 
     OrganizationUID = 1, 
     OrganizationName = "NMC", 
    }; 


    var fake = (NMCSession)fakeHttpSession.Contents["NMCSession"]; 

    A.CallTo(() => fakeHttpContext.Session).Returns(fakeHttpSession); 
    A.CallTo(() => fakeHttpSession["NMCSession"]).Returns(fake); 
    A.CallTo(() => fakeHttpContext.Session).Returns(fakeHttpSession); 
    ControllerContext = new ControllerContext(fakeHttpContext, new RouteData(), A.Fake<ControllerBase>()); 
    myController = new PlatformOrganizationController(nmsFake); 
    myController.ControllerContext = ControllerContext; 
} 

вот мой NMCSession класс

public class NMCSession 
{ 
    private List<Product> m_products=null; 
    public string Login { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int OrganizationUID { get; set; } 
    public string OrganizationName { get; set; } 
    public string InstitutionCode { get; set; } 
    public int DefaultOrganizationUID { get; set; } 

    public string SessionToken { get; set; } 

    public int UserUID { get; set; } 

    public int NMCInactivityTimeOut { get; set; } 

    public bool IsMultiAccountViewable { get; set; } 

    public List<Product> GetProducts() 
    { 
     if(m_products!=null) 
      return m_products; 
     else 
     { 
      string NMSPlatformSvcUrl = System.Configuration.ConfigurationManager.AppSettings["NMSServerProtocol"] + "://" + 
             System.Configuration.ConfigurationManager.AppSettings["NMSServerName"] + ":" + 
             System.Configuration.ConfigurationManager.AppSettings["NMSServerPortNumber"]; 
      HttpClient httpClient = new HttpClient(); 
      httpClient.BaseAddress = new Uri(NMSPlatformSvcUrl); 
      httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      HttpResponseMessage response = httpClient.GetAsync("/NMS/Platform/ConfigurationSvc/v1/Status").Result; 
      if (response.IsSuccessStatusCode) 
      { 
       PlatformStatus status = response.Content.ReadAsAsync<PlatformStatus>().Result; 
       m_products=status.Products; 
      } 
      else 
      { 
       throw new Exception(response.StatusCode.ToString()); 
      } 
      rn m_products; 
     } 
    } 

    public bool IsDevelopmentPartner { get; set; } 
} 

Теперь проблема в контроллере в пользователь должен попытаться использовать NMCSession.GetProducts(), который дает мне исключение.

Теперь, как я могу подделать вышеуказанный метод GetProducts() в NMCSession?

ответ

0

Как минимум, вам необходимо использовать Fake NMCSession. В вашем тесте вы создаете конкретный NMCSession. Также обратите внимание, что если GetProducts не является виртуальным, FakeItEasy не сможет перехватить вызовы, поэтому будет использоваться исходная реализация.

+0

Я пытался подделать NMCSession. См. Отредактированный код. Но я не уверен, как получить данные для «GetProducts». Любой другой способ? Я применил реализацию метода GetProducts. –

+0

В ответ вы только что повторили метод GetProducts. Вы все еще делаете конкретную «NMCSession» (в 'fakeHttpSession.Contents [" NMCSession "] = new NMCSession()'), поэтому вызывается первоначальная реализация. Если вы хотите подделать «NMCSession», вам нужно будет сделать «A.Fake ». И чтобы обеспечить собственное поведение для GetProducts, GetProducts будет виртуальным. –