最小化具有嵌套属性且没有接口的对象

时间:2020-08-05 00:37:29

标签: c# mocking moq

我们有以下代码来测试其是否有效:

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类,也没有接口,如何避免这种情况。

1 个答案:

答案 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);