浓缩代码:SetupSequence在连续调用时返回不同的值

本文关键字:返回 调用 连续 代码 SetupSequence | 更新日期: 2023-09-27 18:05:15

我正在测试一个调用其他方法的方法。我有一个工作测试,它使用此方法生成我的模拟连接对象:

    private Mock<IDatabaseConnection> MockOutGetControlDocInfoData()
    {
        Mock<IDatabaseConnection> mockConn = new Mock<IDatabaseConnection>();
        List<Mock<IDbCommand>> mockCmds = new List<Mock<IDbCommand>>();
        List<long> vals = new List<long>() { 2, 2, 2, 2, 10, 2, 2, 2, 2, 2 };
        foreach (long val in vals)
        {
            mockCmds.Add(CreateMockCmdObjectWithReturnValue(val));
        }
        mockConn.SetupAllProperties();
        mockConn.Setup(c => c.Conn.ConnectionString).Returns("What the heck.");
        mockConn.SetupSequence(c => c.CreateCommand(It.IsAny<string>()))
            .Returns(mockCmds[0].Object)
            .Returns(mockCmds[1].Object)
            .Returns(mockCmds[2].Object)
            .Returns(mockCmds[3].Object)
            .Returns(mockCmds[4].Object)
            .Returns(mockCmds[5].Object)
            .Returns(mockCmds[6].Object)
            .Returns(mockCmds[7].Object)
            .Returns(mockCmds[8].Object)
            .Returns(mockCmds[9].Object);
        return mockConn;
    }

我不满意SetupSequence返回,这似乎应该是一个循环的一部分,但我不知道如何把一个以上的返回到SetupSequence。有什么改进的办法吗?

至少现在,我可以手动创建测试值列表。

这应该是不相关的,但我可以提供CreateMockCmdObjectWithReturnValue代码,如果需要的话。

浓缩代码:SetupSequence在连续调用时返回不同的值

var sequence = mockConn.SetupSequence(c => c.CreateCommand(It.IsAny<string>()));
foreach (var cmd in mockCmds)
{
   sequence = sequence.Returns(cmd.Object);
}