gpt4 book ai didi

asp.net-mvc - 使用 Moq 单元测试 Builder 模式

转载 作者:行者123 更新时间:2023-12-03 22:56:25 25 4
gpt4 key购买 nike

我正在使用构建器模式为 Controller 生成 View 模型,当我尝试对 Controller 进行单元测试时,我发现自己无法这样做。起订量提示。

不确定这是起订量限制还是我自己的限制和无知。

这是我的 Controller 的样子:

public class OutletController : Controller
{
private readonly IOutletViewModelBuilder _builder;

public OutletController(IOutletViewModelBuilder builder)
{
this._builder = builder;
}


public ActionResult Edit(int id)
{
OutletViewModel viewModel = this._builder.WithOutlet(id).WithCountryList().Build();

return View(viewModel);
}
}

我试图 mock IOutletViewModelBuilder 对象,但这就是我得到的:
[Test]
public void DummyTest()
{
Mock<IOutletViewModelBuilder> mockBuilder = new Mock<IOutletViewModelBuilder>();
// (1) // mockBuilder.Setup(m => m.WithOutlet(It.IsAny<int>())).Returns(mockBuilder.Object);
// (2) //mockBuilder.Setup(m => m.WithOutlet(It.IsAny<int>())).Returns(mockBuilder);

// (3) // mockBuilder.Setup(m => m.WithOutlet(It.IsAny<int>()).WithCountryList().Build()).Returns(new OutletViewModel());

OutletController controller = new OutletController(mockBuilder.Object);
ActionResult result = controller.Edit(1);

Assert.IsTrue(true);
}

(1) 给了我以下错误突出显示(mockBuilder.Object)

无法解析方法“Returns(ViewModelBuilders.Builders.IOutletViewModelBuilder)”,候选对象是:
Moq.Language.Flow.IReturnsResult<ViewModelBuilders.Builders.IOutletViewModelBuilder> Returns(System.Func<ViewModelBuilders.Builder.IOutletViewModelBuilder>) (in interface IReturns<IOutletViewModelBuilder,OutletViewModelBuilder>)
Moq.Language.Flow.IReturnsResult<ViewModelBuilders.Builders.IOutletViewModelBuilder> Returns(ViewModelBuilders.Builders.OutletViewModelBuilder) (in interface IReturns<IOutletViewModelBuilder,OutletModelBuilder>)

(2) 引发以下错误:

无法解析方法“Returns(Moq.Mock)”,候选对象是:
Moq.Language.Flow.IReturnsResult<ViewModelBuilders.Builders.IOutletViewModelBuilder> Returns(System.Func<ViewModelBuilders.Builders.OutletViewModelBuilder>) (in interface IReturns<IOutletViewModelBuilder,OutletViewModelBuilder>)
Moq.Language.Flow.IReturnsResult<ViewModelBuilders.Builders.IOutletViewModelBuilder> Returns(ViewModelBuilders.Builders.OutletViewModelBuilder) (in interface IReturns<IOutletViewModelBuilder,OutletViewModelBuilder>)

(3) 不会引发编译时错误,而是引发运行时错误:
System.NotSupportedException : Invalid setup on a non-virtual (overridable in VB) member: m => m.WithOutlet(It.IsAny<Int32>()).WithCountryList().Build()
at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo method)
at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b()
at Moq.Mock.Setup(Mock mock, Expression`1 expression, Func`1 condition)
at ViewModelBuilderTests.OutletControllerTest.DummyTest()

任何帮助将不胜感激。对这个方法进行单元测试应该不难吧?

如果您需要查看实现,您可以在下方看到 Builder 对象。
public class OutletViewModelBuilder
{
private readonly IRepository _repository;
private OutletViewModel _viewModel;

public OutletViewModelBuilder(IRepository repository)
{
this._repository = repository;
this._viewModel = new OutletViewModel();
}

public OutletViewModel Build()
{
return this._viewModel;
}

public OutletViewModelBuilder WithOutlet(int outletId)
{
this._viewModel.Outlet = this._repository.GetOutletById(outletId);

return this;
}

public OutletViewModelBuilder WithCountryList()
{
this._viewModel.CountryList = this._repository.GetCountryList();

return this;
}
}

最后, IOutletViewModelBuilder 界面
public interface IOutletViewModelBuilder
{
OutletViewModel Build();

OutletViewModelBuilder WithOutlet(int outletId);

OutletViewModelBuilder WithCountryList();
}

最佳答案

看起来主要问题是您的 WithOutlet 和 WithCountryList 方法返回的是具体的 OutletViewModelBuilder 而不是 IOutletViewModelBuilder。我想你需要这样的东西:

public interface IOutletViewModelBuilder
{
OutletViewModel Build();
IOutletViewModelBuilder WithOutlet(int outletId);
IOutletViewModelBuilder WithCountryList();
}

那么你的 mock :
var myViewModel = TheOutletViewModelForTesting();
var mockBuilder = new Mock<IOutletViewModelBuilder>();

mockBuilder.Setup(m => m.WithOutlet(It.IsAny<int>())).Returns(mockBuilder.Object);
mockBuilder.Setup(m => m.WithCountryList()).Returns(mockBuilder.Object);
mockBuilder.Setup(m => m.Build()).Returns(myViewModel);

// rest of your test that validates that myViewModel is passed correctly to your view

关于asp.net-mvc - 使用 Moq 单元测试 Builder 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6490337/

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