面对问题,同时在课堂上使用假方法

时间:2016-08-03 13:58:27

标签: asp.net-mvc fakeiteasy

这是我的控制器测试类方法,它将初始化假类

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方法调用?

1 个答案:

答案 0 :(得分:0)

至少,您需要使用假冒NMCSession。在测试中,您将实例化具体的NMCSession。另请注意,除非GetProducts是虚拟的,否则FakeItEasy将无法拦截调用,因此将使用原始实现。