需要为使用c#操作微软单元测试工具中的界面结果的类创建假货

时间:2016-12-27 12:34:52

标签: c# unit-testing nunit moq microsoft-fakes

我需要实现假单元测试我的一种方法。问题是我需要测试调用类方法并检索一些系统参数的方法。场景如下:

 Class A(){
       public void method xx(){
       //This needs to be tested.
       //This method makes a call to retrieve some informations. The call is like 
             below:
             String culture=Api.GetEnvironmentData().GetCulture();
             //This is the problem area.
             boolean implmentApi=Api.GetEnvironmentData().DoImplmentApi();
             //This is the problem area.
      }
    }

这个GetEnvironmentData方法是这样的:

public static EnvironmentData GetEnvironmentData ()
 {
   return GetDiContainer().Resolve<EnvironmentData >();                   
 }

EnvironmentData类是这样的:

public class EnvironmentData(){
 public EnvironmentData(IEnvironmentDataProvider EnvironmentDataProvider){
//
 }
}

我可以使用moq伪造IEnvironmentDataProvider但是我无法弄清楚如何伪造EnvironmentData类。我需要伪造EnvironmentData类,因为它根据各种方法调用操作了IEnvironmentDataProvider的结果。例如,GetCulture和DoImplmentApi都调用接口IEnvironmentDataProvider的getData方法,然后相应地转换它们。 现在,当我伪造IEnvironmentDataProvider并返回一些值时,我无法控制GetCulture和DoImplmentApi被调用时返回的内容。

有人可以建议如何实现上述情况的假货。

2 个答案:

答案 0 :(得分:0)

您不需要模拟 EnvironmentData 类的依赖项。我在这里看到一个问题:你正在使用DI容器,比如Service Locator,在这种情况下它就像antipattern一样。应注入所有依赖项,例如: g。:通过构造函数或属性。

Api 类更改为以下内容:

 public class Api
 {
       private readonly EnvironmentData _environmentData;

       public Api(EnvironmentData envData)
       {
            environmentData = envData;
       }

       public string GetCulture()
       {
            return _envData.GetCulture();                   
       }
 }

请记住,应该隐藏Api类的实现细节。您不应在此方案中公开 EnvironmentData Api 类应该要求实现此类所需的所有依赖项并具有自己的接口。

答案 1 :(得分:0)

根据您的评论,我认为您最好的方法是将静态类包装在外观中。然后你可以嘲笑门面。

这样的事情:

Class A
{
       IEnvironmentDataFacade _environmentDataFacade;
       Class A(IEnvironmentDataFacade environmentDataFacade)
       {
            _environmentDataFacade = environmentDataFacade;
       }

       public void method xx()
       {
            //Now you can fake IEnvironmentDataFacade:
             String culture= _environmentDataFacade.GetCulture();
             //Do the same as above with the method here:
             boolean implmentApi=Api.GetEnvironmentData().DoImplmentApi();
             //This is the problem area.
      }
}

public class EnvironmentDataFacade : IEnvironmentDataFacade
{
      public string GetCulture()
      {
            return Api.GetEnvironmentData().GetCulture();
      }


}

public interface IEnvironmentDataFacade
{
      string GetCulture();
}