c# - 如何更改被 mock 的对象?

标签 c# .net unit-testing testing moq

在我的单元测试中,我需要更改之前模拟的对象的值。例如:

public class Cell
{
    public int X { get; set; }
    public int Y { get; set; }
    public string Value { get; set; }
}

public class Table
{
    private Cell[,] Cells { get; }

    public Table(Cell[,] cells)
    {
        Cells = cells;
    }

    public void SetCell(int x, int y, string value)
    {
        Cells[x, y].Value = value;
    }
}

我想测试 Table 中的 SetCell 方法。

所以,首先我模拟 Cell,然后我创建一个 Cell[,] 单元格数组,创建一个 Table 传递单元格数组作为参数。

SetCell 不起作用,因为(我认为)我无法更改之前模拟的对象。我该如何改变它?

这是我的测试:

ICell[,] cells = new ICell[3, 4];
for (int i = 0; i < cells.GetLength(0); i++)
{
    for (int j = 0; j < cells.GetLength(1); j++)
    {
        var mock = new Mock<ICell>();
        mock.Setup(m => m.X).Returns(i);
        mock.Setup(m => m.Y).Returns(j);
        mock.Setup(m => m.Value).Returns("");

        cells[i, j] = mock.Object;
    }
}            


ITable table = new Table(cells);
table.SetCell(0, 0, "TEST"); // Cannot change it here :/

最佳答案

Setup all the properties以便它们可以更新

ICell[,] cells = new ICell[3, 4];
for (int i = 0; i < cells.GetLength(0); i++)
{
    for (int j = 0; j < cells.GetLength(1); j++)
    {
        var mock = new Mock<ICell>();
        mock.SetupAllProperties();
        mock.Object.X = i;
        mock.Object.Y = j;
        mock.Object.Value = "";

        cells[i, j] = mock.Object;
    }
}

//...other code removed for brevity

关于c# - 如何更改被 mock 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421965/

相关文章:

.net - 为什么.NET 中没有 RAII?

c# - MVVM 和 Caliburn : Replacing All Screens?

c++ - 如何返回 gmock 中的输入参数之一

c# - C# 编译器如何检测 COM 类型?

c# - ASP.NET MVC DropDownList 未设置选定值

c# - 使用 RX 查询,如何在每秒 3 秒的窗口内获取哪些记录具有相同状态?

c++ - 如何在 googlemock 中创建部分(混合)模拟?

unit-testing - 如果我已经在 Vue.js 应用程序中使用 Cypress,我还需要单元测试框架吗?

c# - 使用JNA将c#的字符串转换为java

c# - 检索 SecureString 值后如何清理?