用于 POCO 与 Moq 一起测试的接口
Interface for POCO to test with Moq
我们有一个只有属性的 class,一个没有 return 任何东西的测试方法,我们正在使用 Moq 来模拟它的依赖关系。我们想测试对象的某些 属性 是否已设置。所以我们尝试模拟 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; }
}
我觉得您想 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
是否被调用时,两种情况都将断言为真。
当您声明对 value.Value
所做的更改时,只有第一种情况会成功。
我在这里做假设,但这就是我想传达的:
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.
我们有一个只有属性的 class,一个没有 return 任何东西的测试方法,我们正在使用 Moq 来模拟它的依赖关系。我们想测试对象的某些 属性 是否已设置。所以我们尝试模拟 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; }
}
我觉得您想 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
是否被调用时,两种情况都将断言为真。
当您声明对 value.Value
所做的更改时,只有第一种情况会成功。
我在这里做假设,但这就是我想传达的:
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.