我们有以下代码来测试其是否有效:
Car car = await someService.CreateAsync(wheels);
List<string> urls = car.Input.Endpoints.Select(x => x.Url);
现在,我正在尝试模拟第一行中someService返回的汽车以测试第二行。我尝试过:
var car = new Mock<Car>();
var carEndpoint = new CarEndpoint(url: "http://google.com");
car.Object.Input.Endpoints.Add(carEndpoint);
var someService = new Mock<ISomeService>();
someService.Setup(o => o.CreateAsync(It.IsAny<Wheels>())).ReturnsAsync(car.Object);
var myClass = new ClassToTest(someService.Object);
...
但是会引发错误
System.NotSupportedException:'不支持的表达式:....端点 不可覆盖的成员(此处为Input.get_Endpoints)不能用于 设置/验证表达式。'
问题是Car由我无法修改的someService创建,并且Car或Input均未实现任何接口。为了从顶部测试第二行,我该如何模拟呢?
List<string> urls = car.Input.Endpoints.Select(x => x.Url);
根据要求,我要离开Car类(简体):
namespace X
{
[JsonTransformation]
public class Car : AnotherClass
{
public Car();
public Car(CarInput input, string description, ...);
[JsonProperty(PropertyName = "properties.description")]
public string Description { get; set; }
[JsonProperty(PropertyName = "properties.input")]
public CarInput Input { get; set; }
...
}
}
有人提议在没有Moq的情况下手动创建对象,这样做我们不得不写很多行,因为第一,因为第二行不是我们正在测试的唯一属性(请记住,这是一个简化的场景),第二,我们必须在所有地方放置新的东西以创建嵌套属性所需的结构。鉴于我们不能修改Car类,也没有接口,如何避免这种情况。
答案 0 :(得分:2)
因此,鉴于Car或多或少被列为POCO,为什么不这么做
var car = new Car();
var carEndpoint = new CarEndpoint(url: "http://google.com");
car.Input = new CarInput { Endpoints = new [] { carEndpoint } };
// or convert the above to list or whatever you have
var someService = new Mock<ISomeService>();
someService.Setup(o => o.CreateAsync(It.IsAny<Wheels>())).ReturnsAsync(car);
var myClass = new ClassToTest(someService.Object);