gpt4 book ai didi

c# - 使用 Moq 测试 View 模型构造函数参数

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:04 25 4
gpt4 key购买 nike

我有一个用 ASP.NET Core 编写的基本 CRUD 应用程序,示例 Controller 操作如下所示:

public IActionResult Sheet(Guid characterId)
{
var character = _repository.GetCharacter(characterId);
// omit validation for brevity
return View("Sheet", new ViewModel(character, true, true));
}

还有一个示例单元测试:

[Fact]
public void TestSheet()
{
// Arrange stuff and mock setup
// Act
var result = _controller.Sheet(characterId) as ViewResult;

// Assert
Assert.NotNull(result);

// assert ViewModel constructor called with x arguments
}

其他研究似乎建议对对象进行模拟,但这不适合这种情况。我可以简单地让 ViewModel 的构造函数设置几个 getter 属性,但这似乎是在深入测试 ViewModel 而不是 Controller 。 Controller 不应该关心 ViewModel 对传递给它的值做了什么,在我看来测试也不应该关心 - 测试是在测试 Controller 是否正常运行,实际上应该只测试它是否传递了正确的值.几个 getter 属性当然可以实现这一点,但这在概念上似乎是错误的。

最佳答案

该操作与 View 模型的创建紧密耦合,并且可以反转

public interface IViewModelFactory {
T CreateNew<T>(params object[] args) where T : ViewModelBase;
}

public class ViewModelFactory : IViewModelFactory {
public T CreateNew<T>(params object[] args) where T : ViewModelBase {
return (T)Activator.CreateInstance(typeof(T), args);
}
}

public class ViewModelBase { }

这样创建/初始化 View 模型就不是 Controller 的责任了。这将是一个显式依赖项,注入(inject)到 Controller 中并用于创建 View 模型。

public IActionResult Sheet(Guid characterId) {
var character = _repository.GetCharacter(characterId);
// omit validation for brevity
return View("Sheet", _viewModelFactory.CreateNew<ViewModel>(character, true, true));
}

并且在单元测试中执行时可以断言所需的行为

[Fact]
public void TestSheet() {
// Arrange stuff and mock setup
var factory = new Mock<IViewModelFactory>();
factory.Setup(_ => _.CreateNew<ViewModel>(It.IsAny<object[]>()))
.Returns((object[] args) =>
new ViewModel((Character)args[0], (bool)args[1], (bool)args[2])
);

// Act
var result = _controller.Sheet(characterId) as ViewResult;

// Assert
Assert.NotNull(result);

// assert ViewModel constructor called with x arguments
factory.Verify(_ => _.CreateNew<ViewModel>(It.IsAny<Character>(), true, true), Times.AtLeastOnce());
}

关于c# - 使用 Moq 测试 View 模型构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45752730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com