簡體   English   中英

如何在C#中的靜態類中模擬普通方法?

[英]How to mock a normal method inside a static class in 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;   
      }


}

答案是“不,沒有更改現有代碼就無法模擬的方法”。

代碼不能輕松地包含在單元測試中這一事實證明了代碼本身存在問題。 因此,我真的建議您重新考慮該方法。

如果這不是實際任務,則可以嘗試以下技巧。 使用公共設置器(在測試代碼中設置)將TestData作為屬性公開:

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

將當前功能分為兩部分:

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 ,現在您可以使用適當的輸入值測試“某些邏輯”。

請注意,當您使用InternalsVisibleTo屬性時, GetData2可能是internal

使用隔離器,您可以簡單地執行以下操作:

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);
    }

還是您還有其他想法?

無需將類設為靜態。 您可以在非靜態類中使用靜態方法。 然后,您可以讓靜態方法調用非靜態方法。

   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";
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM