[英]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.