Mik*_*ike 7 c# unit-testing moq
对于像这样的方法:
protected virtual bool DoSomething(string str) { }
Run Code Online (Sandbox Code Playgroud)
我经常嘲笑它:
var mockModule = new Mock<MyClass> { CallBase = true };
mockModule.Protected().Setup<bool>("DoSomething", ItExpr.IsAny<string>()).Returns(true);
Run Code Online (Sandbox Code Playgroud)
但对于像这样的方法:
protected virtual bool DoSomething(out string str) { }
Run Code Online (Sandbox Code Playgroud)
我怎么嘲笑它?
自moq 4.8.0-rc1(2017-12-08)起可以完成此操作。您可以使用ItExpr.Ref<string>.IsAny来匹配ref或out参数的任何值。在您的情况下:
mockModule.Protected().Setup<bool>("DoSomething", ItExpr.Ref<string>.IsAny).Returns(true);
Run Code Online (Sandbox Code Playgroud)
模拟out参数的完整示例:
[TestClass]
public class OutProtectedMockFixture
{
delegate void DoSomethingCallback(out string str);
[TestMethod]
public void test()
{
// Arrange
string str;
var classUnderTest = new Mock<SomeClass>();
classUnderTest.Protected().Setup<bool>("DoSomething", ItExpr.Ref<string>.IsAny)
.Callback(new DoSomethingCallback((out string stri) =>
{
stri = "test";
})).Returns(true);
// Act
var res = classUnderTest.Object.foo(out str);
// Assert
Assert.AreEqual("test", str);
Assert.IsTrue(res);
}
}
public class SomeClass
{
public bool foo(out string str)
{
return DoSomething(out str);
}
protected virtual bool DoSomething(out string str)
{
str = "boo";
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
Gre*_*ott -4
这可以通过使用Typemock Isolator来完成,您可以模拟您的非公共方法并轻松更改它们的 out 和 ref 参数:
[TestMethod, Isolated]
public void test()
{
// Arrange
string str;
SomeClass classUnderTest = new SomeClass();
Isolate.NonPublic.WhenCalled(classUnderTest, "DoSomething").AssignRefOut("test").IgnoreCall();
// Act
classUnderTest.foo(out str);
// Assert
Assert.AreEqual("test", str);
}
public class SomeClass
{
public void foo(out string str)
{
DoSomething(out str);
}
protected virtual bool DoSomething(out string str)
{
str = "boo";
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里读更多关于它的内容。
| 归档时间: |
|
| 查看次数: |
3808 次 |
| 最近记录: |