最小起订量 - 验证增量属性调用

本文关键字:属性 调用 验证 | 更新日期: 2023-09-27 18:34:01

下面的代码片段最好地解释了我想要实现的目标:

[Test]
public void ReplayGoalTeamATest()
{
    var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>();
    new IceHockeyActionLogRecord { Event = "goal", Team = "A"}.Replay(stateMachineMock.Object);
    stateMachineMock.Verify(s=>s.TeamAScore++); //Syntax error
}

最小起订量 - 验证增量属性调用

如果你在IIceHockeyOddsStateMachine接口上同时有getter和setter,你可以验证该值是否像这样递增:

var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>();
stateMachineMock.SetupAllProperties();
stateMachineMock.Object.TeamAScore = 0;
new IceHockeyActionLogRecord { Event = "goal", Team = "A"}.Replay(stateMachineMock.Object);
Assert.That(stateMachineMock.Object.TeamAScore, Is.EqualTo(1));

当你执行s.TeamAScore++时,你有两个不同的操作,你应该设置和验证。第一个操作是从依赖项中获取当前分数,第二个操作是设置新分数:

int score = stateMachine.TeamAScore;
// other staff
stateMachine.TeamAScore = score + 1;

因此,我会显式定义这种与依赖项的交互:

// Arrange
Mock<IIceHockeyOddsStateMachine> stateMachineMock = new Mock<IIceHockeyOddsStateMachine>();
stateMachineMock.SetupGet(s => s.TeamAScore).Returns(0);
IceHockeyActionLogRecord record = new IceHockeyActionLogRecord { Event = "goal", Team = "A"};
// Act
record.Replay(stateMachineMock.Object);
// Assert
stateMachineMock.VerifySet(s => s.TeamAScore = 1); 

在本例中,您正在测试IceHockeyActionLogRecord,以及它与依赖项交互的方式。测试成为对象之间交互的规范。

当您验证 TeamAScore 值时,您正在测试模拟实现。此外,使用回调将测试您的代码,而不是测试对象之间的交互。

另外,我会在您的测试中为幻数命名,甚至提供参数:

[TestCase(0, 1)]
[TestCase(50, 51)]
public void ShouldIncrementTeamScore(int initialScore, int expectedScore)
{
    var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>();
    stateMachineMock.SetupGet(s => s.TeamAScore).Returns(initialScore);
    IceHockeyActionLogRecord foo = new IceHockeyActionLogRecord();
    foo.Replay(stateMachineMock.Object);
    stateMachineMock.VerifySet(s => s.TeamAScore = expectedScore);            
}

更新:如果您的接口没有属性的 getter,则只需修改安排部分测试(不要设置属性 getter 调用):

// Arrange
var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>();
var record = new IceHockeyActionLogRecord { Event = "goal", Team = "A"};
// Act
record.Replay(stateMachineMock.Object);
// Assert
stateMachineMock.VerifySet(s => s.TeamAScore = 1); 

你试过使用 .CallBack() 方法代替 ?不确定验证是否支持上述实现