我需要在静态方法
中模拟一个普通的方法我的方法是这样的,可以在这里模拟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;
}
}
答案 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";
}
}
}