Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有依赖注入的情况下模拟我们在c#中测试的同一类的另一个方法_C#_.net_Unit Testing_Automation_Moq - Fatal编程技术网

如何在没有依赖注入的情况下模拟我们在c#中测试的同一类的另一个方法

如何在没有依赖注入的情况下模拟我们在c#中测试的同一类的另一个方法,c#,.net,unit-testing,automation,moq,C#,.net,Unit Testing,Automation,Moq,我面临一个场景,需要在c#中模拟同一类的另一个方法。但我面临的问题是嘲笑另一种方法和我在下面分享的方法 Interface --> public interface IFetch { string GetColorCodes(); string FetchData(); } Class--> public class Fetch : IFetch { public Fetch() { //I dont

我面临一个场景,需要在c#中模拟同一类的另一个方法。但我面临的问题是嘲笑另一种方法和我在下面分享的方法

 Interface --> 

  public interface IFetch
  {
     string GetColorCodes();

     string FetchData();

  }

  Class-->
 public class Fetch : IFetch 
 {

    public Fetch()
    {
     //I dont have any dependency injection
    }

   public string GetColorCodes() {
    return "Yellow";
   }

   public string FetchData(){
   string  color= GetColorCodes();
   return color;
 }
现在,在为测试FetchData()方法创建单元测试时,我不希望它在内部调用GetColorCodes()方法并返回“Yellow”。我想返回一些其他颜色,如“红色”。 因为没有依赖项,方法在同一个类中,所以我无法找到方法。如果有人有想法,请与此示例代码共享

[TestFixture]
class FetchTest 
{
   [Test]
   public void FetchDataTest()
  {
   Fetch obj=new Fetch();
   string color= obj.FetchData();
  Assert.IsEquals(color,"Red")
  }

}

I want to mock the GetColorCodes() method from the test to Return Red color.

FetchData方法在此处没有任何依赖项。您不能模拟类的一部分来测试类的另一部分。您需要在此处引入一些依赖关系,例如:

   public interface IColorProvider
   {
       string GetColor();
   }

   public class DefaultColorProvider : IColorProvider
   {
       public string GetColor => "Yellow";
   }

    public class Fetch : IFetch 
    {
        private readonly IColorProvider _colorProvider;
        public Fetch(IColorProvider colorProvider)
        {
          _colorProvider = colorProvider
        }

        public string FetchData(){
        string  color= _colorProvider.GetColor()
        return color;
    }       
    public class Fetch : IFetch 
    {
        private readonly IColorProvider _colorProvider;
        public Fetch(IColorProvider colorProvider)
        {
          _colorProvider = colorProvider
        }

        public string GetColorCodes() {
             return _colorProvider.GetColor();
        }

        public string FetchData(){
        string  color= GetColorCodes();
        return color;
    }
在本例中,您有明确的依赖关系,可以模拟IColorProvider的行为并测试FetchData的行为

更新: 您可以这样做:

   public interface IColorProvider
   {
       string GetColor();
   }

   public class DefaultColorProvider : IColorProvider
   {
       public string GetColor => "Yellow";
   }

    public class Fetch : IFetch 
    {
        private readonly IColorProvider _colorProvider;
        public Fetch(IColorProvider colorProvider)
        {
          _colorProvider = colorProvider
        }

        public string FetchData(){
        string  color= _colorProvider.GetColor()
        return color;
    }       
    public class Fetch : IFetch 
    {
        private readonly IColorProvider _colorProvider;
        public Fetch(IColorProvider colorProvider)
        {
          _colorProvider = colorProvider
        }

        public string GetColorCodes() {
             return _colorProvider.GetColor();
        }

        public string FetchData(){
        string  color= GetColorCodes();
        return color;
    }

因此,类中的更改将非常小,但它将使您能够测试这一点。

如果您在使
GetColorCodes()
虚拟化方面没有问题,那么您可以使用测试模式。在测试中,使用您希望使用的模拟值新建FetchStub,并在测试下从同一实例调用您的方法FetchData:

public class FetchStub : Fetch
{
    private readonly string _colorCode;
    public FetchStub(string colorCode)
    {
        _colorCode = colorCode;     
    }

    public override string GetColorCodes()
    {
        return _colorCode;
    }
}


public class Fetch
{

    public Fetch()
    {
        //I dont have any dependency injection
    }

    public virtual string GetColorCodes()
    {
        return "Yellow";
    }

    public string FetchData()
    {
        string color = GetColorCodes();
        return color;
    }
}

问题是这是一个现有的类,它有几个方法,我无法为GetColor()创建接口方法您可以尝试使用TypeMock隔离器对现有代码进行处理,它有很多方法来模拟方法甚至实例方法,但我不确定这是否是一种好的做法。这就是模拟的问题:您需要测试代码。你决定用嘲弄。现在你有两个问题。这在无约束的隔离框架中是可能的,比如TypeMock或JustMock(两者都是付费的)和MS Fakes。您使用什么隔离框架?这似乎是一个。目前的问题也不完整,因此不清楚。阅读并编辑问题,提供可用于重现问题的答案,以便更好地理解实际提出的问题。如果原始方法始终返回“黄色”,为什么需要测试“红色”?