如何解决Moq 抽象类方法结果
public class Derived : BaseClass
{
public string PrintStringValue(string value)
{
var baseValue = base.GetTestString(value);
return baseValue;
}
}
public abstract class BaseClass
{
public virtual string GetTestString(string value)
{
return value + "from base class";
}
}
[TestFixture]
public class TestDerivedClass
{
private Mock<BaseClass> _mockBaseClass;
[SetUp]
public void Initialize()
{
_mockBaseClass = new Mock<BaseClass>();
}
[Test]
public void TestDerived()
{
_mockBaseClass.Setup(x => x.GetTestString(It.IsAny<String>())).Returns("My Mocked string value");
var result = GetDerived().PrintStringValue(It.IsAny<String>());
Assert.AreEqual("My Mocked string value",result); //this fails since the base method is
called
}
private Derived GetDerived()
{
return new Derived();
}
}
我想知道的是,当 base.GetTestString(value) 获取时,是否有可能返回模拟结果(“My Mocked string value”)在派生类中执行,而不是实际返回的返回值+“来自基类”。
解决方法
将您的 Derived
类更改为调用 this
而不是 base
,这样您就不会显式使用基类的实现:
public string PrintStringValue(string value)
{
var baseValue = this.GetTestString(value);
return baseValue;
}
然后模拟 Derived
,因为您不能模拟 BaseClass
并让它影响 Derived
:
var mock = new Mock<Derived>() { CallBase = true };
mock.Setup(x => x.GetTestString(It.IsAny<string>())).Returns("Hello");
var obj = mock.Object;
Assert.Equal("Hello",obj.PrintStringValue("abc"));
您不能模拟 BaseClass
并让它影响 Derived
的原因是因为 Moq 有效地根据模拟的更改动态创建了派生类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。