繁体   English   中英

POCO 使用 Moq 进行测试的接口

[英]Interface for POCO to test with Moq

我们有一个只有属性的 class,这是一种不返回任何东西的测试方法,我们正在使用 Moq 来模拟它的依赖关系。 我们想测试是否设置了 object 的某些属性。 所以我们尝试模拟 class 所以稍后我们将使用 Moq 中的 VerifySet 方法,它抱怨该属性未标记为虚拟也不是接口。 创建一个接口是可行的,我们可以根据需要验证属性。 我们是否应该为所有东西创建一个接口,包括像这样的案例,一个 POCO?

下面我包含一个最小的示例,但实际代码要大得多。

Class

public class Car
{
    public string Id { get; set; }

    public string Name { get; set; }
}

测试

var mock = Mock<ICar>();

handler.Handle(mock);

mock.VerifySet(x=> x.Name = "Furioso");

方法

public void Handle(Car car)
{
    car.Name = "Furioso"
}

界面

public interface ICar
{
    public string Id { get; set; }

    public string Name { get; set; }
}

我在这里做出假设,但这就是我想要传达的内容:

var car = new Car(); //no behavior to mock here, just a DTO. You may have to set values to this instance before passing it (or not).

handler.Handle(car); //handler is the instance of the class being tested

//Any other assertions
Assert.Equal("Furioso", car.Name); //I don't use Moq, but whatever is equivalent.

在我看来,您想要assert更改而不是检查是否已调用setter

真正考虑一下您要在这里测试的内容,例如假设您有一项更改某些属性的service

public class MyValue {
    public string Value { get; set; }
}

public class MyService {
    
    public void ChangeValues(MyValue value, string toValue) {
    
        value.Value = toValue;
    }
}

如果服务如下所示:

public class MyService {
    
    public void ChangeValues(MyValue value, string toValue) {
    
        value.Value = "toValue";
    }
}

当测试setter是否被调用时,两种情况都将断言为 true。

当您断言对value.Value所做的更改时,只有第一种情况会成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM