【发布时间】:2015-07-21 15:25:28
【问题描述】:
我正在尝试模拟(使用 Moq)一个类,在一个只公开两个属性的类上设置一个返回对象。
在我有限的起订量经验中,我通常会使用 Setup() lamda 来定义方法调用,然后使用 Returns() 来返回所需的输出。
我在这里遇到的是Setup()。当构造函数完成工作、填充两个属性然后返回时,没有可以调用的“方法”。
我想模拟的班级...显然被愚弄了:
public class CarResponse
{
public IMetaModel meta { get; set; }
public List<ICarModel> cars { get; set; }
public CarResponse(Common.Models.Car car)
{
this.cars = new List<ICarModel>();
}
}
我微弱的嘲讽尝试:
private Mock<CarResponse> _carResponse = new Mock<CarResponse>(MockBehavior.Strict);
_carResponse.Setup( ????? ).Returns(new CarResponse() { meta = new MetaModelV2(), cars = foo });
为了进一步澄清......这是我正在尝试为其编写单元测试的代码:
public HttpResponseMessage AddPickup()
{
//....code removed for brevity....
//this repository is mocked and returns the object exactly as I want it
var car = carRepository.GetCar(carId);
if (!errorInfo.Any()) //This check is bogus it never gets sets
{
RequestHelper rqh = new RequestHelper();
response = rqh.CreateResponse(Request, HttpStatusCode.OK, new CarResponse(car));
}
我的单元测试:
[TestMethod]
public void AddValidPickupCorrectResponse()
{
//arrange
//...lots of code here left off for setting up http context etc
//act---
var response = controller.AddPickup();
//assert
}
如果我按照建议使用预先确定的对象,我将如何将其“挂钩”到被测代码。例如,我编写了一个使用我的预装对象而不是 Moq 的单元测试,但是我如何让 SUT 使用该预装对象?
【问题讨论】:
-
CarResponse是一个PoCo类,为什么要模拟它? -
@OldFox...是的,它确实是一个 PoCo...我如何将它从我的单元测试“传递”到 SUT?
-
您的 SUT 看起来如何?示例中的问题是什么?(带有
CreateResponse的示例)请添加UT,您要验证的场景以及被测类... -
您希望您的
AddPickup方法如何使用模拟对象?它直接调用new CarResponse,那么它怎么知道你想让它做一些不同的事情呢? -
我想这就是您要问的问题。您可能需要像 CarResponse 工厂这样的东西,它可以在测试时返回模拟对象。但我认为我们没有足够的细节来知道这是否真的是您在这种情况下想要的。
car变量来自哪里?你希望你的测试断言什么?
标签: c# unit-testing moq