如何在C#中模拟静态类中的普通方法?

时间:2017-11-02 06:45:43

标签: c#

我需要在静态方法

中模拟一个普通的方法

我的方法是这样的,可以在这里模拟TestResult吗?

我已经完成了通过使用接口在方法内部模拟方法,但这里是静态方法

public static ClassData()
{

       public static string GetData()
       {
           //Wish to mock TestResult method
           TestData TD=new TestData();
           string FinalResult=TD.TestResult();
           //Some logic
           Return FinalResult;   
      }


}

4 个答案:

答案 0 :(得分:0)

答案是“不,没有改变现有代码就无法模拟”。

代码无法通过单元测试轻松覆盖这一事实证明代码本身存在问题。所以我真的建议重新审视这种方法。

如果这不是一项实际任务,您可以尝试以下技巧。将TestData公开为具有公共setter的属性(您在测试代码中设置):

public static class ClassData
{

    public static string GetData()
    {
        //Wish to mock TestResult method
        TestData TD = new TestData();
        string FinalResult = TestData.TestResult();
        //Some logic
        return FinalResult;
    }

    public static TestData TestData { private get; set; }
}

public class TestData
{
    public virtual string TestResult()
    {
        return string.Empty;
    }
}

只是一个测试机构的想法:

var testDataMock = new Mock<TestData>(); // Moq as example
testDataMock.Setup(t => t.TestResult()).Returns("some string");
ClassData.TestData = testDataMock.Object; 
var result = ClassData.GetData();

//Assertions

答案 1 :(得分:0)

将当前功能分为两部分:

public static ClassData()
{
   public static string GetData()
   {
       //Wish to mock TestResult method
       TestData TD=new TestData();
       string FinalResult=TD.TestResult();
       return GetData2(FinalResult);   
  }
  public static string GetData2(string FinalResult)
  {
       //Some logic
       return FinalResult;   
  }       
}

在您的测试用例中,请拨打GetData2而不是GetData,现在您可以测试某些逻辑&#34;有适当的输入值。

请注意,使用GetData2属性时,internal可能为InternalsVisibleTo

答案 2 :(得分:0)

使用Isolator,您只需执行以下操作:

public static class ClassData
    {
        public static string GetData()
        {
            //Wish to mock TestResult method
            TestData td = new TestData();
            string finalResult = td.TestResult();
            //Some logic
            return finalResult;
        }

    }

    [TestMethod, Isolated]
    public void Test_MockFinalResult()
    {
        var fakeTestData = Isolate.Fake.NextInstance<TestData>();
        Isolate.WhenCalled(() => fakeTestData.TestResult()).WillReturn("test");
        var str = ClassData.GetData();
        Assert.AreEqual("test",str);
    }

或者你还有别的想法吗?

答案 3 :(得分:-2)

无需使类静态化。您可以在非静态类中使用静态方法。然后,您可以将静态方法调用为非静态方法。

   public class test
    {

        public static string GetData()
        {
            //Wish to mock TestResult method
            TestData TD = new TestData();
            string FinalResult = TD.TestResult();
            //Some logic
            return FinalResult;
        }
        public class TestData
        {
            public string TestResult()
            {
                return "Hello World";
            }
        }
    }