【发布时间】:2017-07-28 14:20:39
【问题描述】:
当我尝试使用 Moq 解决不同的情况时,我尝试使用 SetupSet 来解决。这发现了另一个潜在问题。
当我在属性上使用 SetupSet 以及在方法上使用设置时,起订量似乎“忘记”了方法上的设置已经完成。
这里是示例代码,很简单:
public class Prancer
{
public Prancer(bool pIsMale)
{
IsMale = pIsMale;
ExecuteMe();
}
private bool _IsMale;
public virtual bool IsMale
{
get { return this._IsMale; }
private set { this._IsMale = value; }
}
private bool _Antlers;
public virtual bool Antlers
{
get { return this._Antlers; }
set
{
this._Antlers = value;
}
}
public virtual void ExecuteMe()
{
throw new Exception("Why am I here?");
}
}
这里是单元测试:
public class PrancerTests
{
[Fact]
public void Antlers_NoSetup()
{
// Arrange
// create mock of class under test
var sut = new Mock<Prancer>(true) { CallBase = true };
sut.Setup(x => x.ExecuteMe()); // nullify
// Act
sut.Object.Antlers = true;
// Assert
sut.VerifySet(x => x.Antlers = true);
}
[Fact]
public void Antlers_SetupProperty()
{
// Arrange
// create mock of class under test
var sut = new Mock<Prancer>(true) { CallBase = true };
sut.SetupProperty(x => x.Antlers, false);
sut.Setup(x => x.ExecuteMe()); // nullify
// Act
sut.Object.Antlers = true;
// Assert
sut.VerifySet(x => x.Antlers = true);
}
[Fact]
public void Antlers_SetupSet()
{
// Arrange
// create mock of class under test
var sut = new Mock<Prancer>(true) { CallBase = true };
sut.SetupSet(x => x.Antlers = true);
sut.Setup(x => x.ExecuteMe()); // nullify
// Act
sut.Object.Antlers = true;
// Assert
sut.VerifySet(x => x.Antlers = true);
}
}
我使用 SetupSet 的单元测试报告了 ExecuteMe() 方法中抛出的异常(“我为什么在这里?”),这证明了 ExecuteMe() 方法即使在存在 Setup(x => x.ExecuteMe ()) 来防止它。其他两个单元测试通过(显然不执行 ExecuteMe())。
我什至尝试为 ExecuteMe() 设置回调,但结果相同。我还颠倒了 Setup 和 SetupSet 的顺序(在代码中),但无济于事。
任何想法为什么 SetupSet 可能会影响方法 Setup?
【问题讨论】:
-
它没有,我找不到说明原因的文档,但是
SetupSet会通过构造函数,而您的其他设置/验证都没有。构造函数中调用的虚拟方法可能会导致奇怪的行为,但这看起来SetupSet也有奇怪的地方
标签: c# unit-testing moq