【发布时间】:2020-08-05 00:37:29
【问题描述】:
我们有以下代码来测试它是否有效:
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; }
...
}
}
建议在没有起订量的情况下手动创建对象,这样做我们必须写很多行,首先因为第二行不是我们要测试的唯一属性(记住这是一个简化的场景),其次我们必须在任何地方放置 new 来创建嵌套属性所需的结构。既然我们不能修改 Car 类,它也没有接口,如何避免这种情况。
【问题讨论】:
-
请发
Car类 -
99% 你真的不需要模拟一辆车,简单地创造一辆就可以了……但事实上,正如@zaitsman 所说,没有实际例子,我们无能为力。
-
Car 是一个外部类,有很多属性本身就是外部对象,Input 就是其中之一,没有一个实现接口。尽管如此,我还是会添加课程。
-
@zaitsman Alexei 完成