虽然我正在尝试解决与Moq不同的情况,但我试图使用SetupSet来解决。这揭开了另一个潜在的问题。使用SetupSet'忘记'方法设置
当我在一个属性上使用SetupSet和一个方法上的设置时,Moq似乎'忘记'方法上的设置已完成。
下面是示例代码,非常简单:
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()方法中抛出,它证明即使在有Setup(x => x.ExecuteMe())的情况下,ExecuteMe()方法也会执行以防止它。另外两个单元测试通过(显然不执行ExecuteMe())。
我甚至试图把安装程序的ExecuteMe()回调,但结果相同。我也颠倒了Setup和SetupSet的顺序(在代码中),无济于事。
任何想法为什么SetupSet可能会影响安装方法?
它没有,我无法找到为什么文档,但'SetupSet'通过构造函数,其中没有其他设置/验证所做的。在构造函数中调用的虚方法会导致奇怪的行为,但是这看起来像'SetupSet'还有一个奇怪的地方 – Kritner