【问题标题】:Unit Test for Task method with dependency injection具有依赖注入的任务方法的单元测试
【发布时间】:2015-05-04 09:23:06
【问题描述】:

我是在 Visual Studio 中编写单元测试的新手。在我的网络应用程序中,我有以下内容。

1> 接口

public interface IGettProxy
{
    Task<List<CityDetails>> getCity();
    Task<List<CountryDetails>> getCountry(int cityId);
}

2> 合约(接口的实现)

  public async Task<List<CityDetails>> getCity()
    {
        try
        {

            _serviceUrl = String.Format("{0}/Search/getCityinfo", _serviceUrl);
            string requestUri = _serviceUrl;
            client = new HttpClient();
            var response = await client.GetAsync(requestUri);
            if (response.IsSuccessStatusCode)
            {
                string json = await response.Content.ReadAsStringAsync();
                var Result = new          JavaScriptSerializer().Deserialize<List<CityDetails>>(json);
                return Result;
            }
            else
            {
                throw new Exception("Errorhandling message");
            }
        }
        catch (Exception ex) { throw ex; }
    }


    public async Task<List<CountryDetails>> getCountry(int cityId)
    {
        try
        {
            _serviceUrl = String.Format("{0}/Search/getcountryinfo?cityId={1}", _serviceUrl, cityId);
            string requestUri = _serviceUrl;
            client = new HttpClient();
            var response = await client.GetAsync(requestUri);
            if (response.IsSuccessStatusCode)
            {
                string json = await response.Content.ReadAsStringAsync();
                var Result = new JavaScriptSerializer().Deserialize<List<CountryDetails>>(json);
                return Result;
            }
            else
            {
                throw new Exception("Errorhandling message");
            }
        }
        catch (Exception ex) { throw ex; }
    }

3> 控制器

       private IGettProxy igettProxy;

    public GettController(IGettProxy gettProxy)
    {
        igettProxy = gettProxy;
    }

    /// <summary>
    /// Invoked on Page Load
    /// </summary>
    /// <returns></returns>
    public async Task<ActionResult> Getdet()
    { 
        try
        {
            List<CityDetails> cityDetails = await igettProxy.getCity();
            SearchModel viewModel = new SearchModel();
            viewModel.cityDetail = cityDetails;
            return View(viewModel);
        }
        catch (Exception ex) { throw ex; }
    }

    /// <summary>
    /// Get Country list based on city information
    /// </summary>
    /// <param name="cityId"></param>
    /// <returns></returns>
    public async Task<JsonResult> getCountry (int cityId)
    {
        try
        {
            List<CountryDetails> CountryDetails = await iSearchProxy.getCountry(cityId);
            return Json(CountryDetails,JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex) { throw ex; }
    }

我有不同的数据成员类库。

对于注入配置,我使用 Unity 方法。

所以在这个视图中我有下拉绑定城市,国家的价值。

对于这个下拉绑定,我想编写单元测试。请帮我解决这个细节。提前致谢。

我的测试方法

 [TestMethod]
        public void bookAppointment()
        {

             List<CityDetails> cityDetails = new List<CityDetails>();
             cityDetails.Add(new CityDetails {ID=1,CityName="Delhi"});
          //  var mockproxy = new StubISearchProxy();
            StubISearchProxy searchProxy = new StubISearchProxy();

            searchProxy.GetCity = () =>  cityDetails;

            SearchController searchController = new SearchController(searchProxy);
            var str = searchController.getCity();
        }

【问题讨论】:

  • 您究竟想在代码中进行什么单元测试?你不知道什么或问题出在哪里?方法名称也遵循 .net 命名约定,即 PascalCase。
  • 嗨@SriramSakthivel,感谢您对我的问题的看法。我已经更新了我的测试功能。我真的很感动。我不知道我必须为下拉绑定做什么。并在实现中使用 Task。
  • MVC 的理念是您不测试 UI。您在控制器和您使用的其他服务中测试业务逻辑。您的测试方法也缺少断言。断言必须是真/假。我不清楚你不知道什么。很抱歉。
  • @SriramSakthivel - 在我的控制器中,我有 Getdet() 方法。我想为此方法编写单元测试。

标签: c# unit-testing model-view-controller dependency-injection microsoft-fakes


【解决方案1】:

在 DI Unity 中,将为您解决此接口实现。为了测试这一点,您必须创建一个实现您的接口的假类,并注入(在构造函数上)。 比如:

public class FakeClass : IGettProxy {
public Task<List<CityDetails>> getCity(){
// here goes your fake implementation, to be injected on your controller.
}
// Remember to implement the other method 
}

然后,当您实例化控制器时,您将传递接口的这个假实现(构造函数需要的)。

现在你可以测试它了。

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多