C# POCO与Moq测试的接口

C# POCO与Moq测试的接口,c#,oop,interface,moq,C#,Oop,Interface,Moq,我们有一个只包含属性的类,一个不返回任何内容的测试方法,我们使用Moq来模拟它的依赖关系。我们想测试是否设置了对象的某些属性。因此,我们尝试模拟该类,因此稍后我们将使用Moq中的VerifySet方法,它会抱怨,因为属性未标记为虚拟,也不是接口。创建接口是可行的,我们可以根据需要验证属性。我们是否应该为所有事情创建一个接口,包括像这样的情况,一个POCO 下面我提供了一个简单的示例,但实际代码要大得多 阶级 试验 接口 public interface ICar { public str

我们有一个只包含属性的类,一个不返回任何内容的测试方法,我们使用Moq来模拟它的依赖关系。我们想测试是否设置了对象的某些属性。因此,我们尝试模拟该类,因此稍后我们将使用Moq中的VerifySet方法,它会抱怨,因为属性未标记为虚拟,也不是接口。创建接口是可行的,我们可以根据需要验证属性。我们是否应该为所有事情创建一个接口,包括像这样的情况,一个POCO

下面我提供了一个简单的示例,但实际代码要大得多

阶级

试验

接口

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

    public string Name { get; set; }
}

在我看来,您希望
断言
更改,而不是检查是否调用了
setter

仔细考虑一下您在这里要测试的内容,例如,假设您有一个
服务
,它可以更改某些属性

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所做的更改时,只有第一种情况会成功。

我觉得您希望
断言
更改,而不是检查是否调用了
setter

仔细考虑一下您在这里要测试的内容,例如,假设您有一个
服务
,它可以更改某些属性

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
所做的更改时,只有第一种情况会成功。

我在这里做出假设,但这正是我想要表达的:

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.

我在这里做假设,但这就是我想要表达的:

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.

我个人认为你在测试错误的东西。在我看来,您需要重新思考您的测试(抱歉,我知道这不是一个真正的答案),您正在测试的类不应该被嘲笑。类的依赖项(如果有)将被模拟。如果执行此操作,则无论在该类中设置了什么属性,都可以在运行正在测试的任何方法后在断言步骤中进行检查。“你不能模拟POCOs。@疯狂的开发者,如果不模拟Car,如果方法返回void,你怎么能断言它按预期修改了呢?我个人认为你在测试错误的东西。”。在我看来,您需要重新思考您的测试(抱歉,我知道这不是一个真正的答案),您正在测试的类不应该被嘲笑。类的依赖项(如果有)将被模拟。如果执行此操作,则无论在该类中设置了什么属性,都可以在运行正在测试的任何方法后在断言步骤中进行检查。你不能模拟POCOs。@疯狂的开发者,如果不模拟Car,如果该方法返回void,你怎么能断言它按预期修改了?我不确定“当你断言对value所做的更改时,我是否理解了这一部分。只有第一种情况才会成功。”我明白我应该断言新的值,而不仅仅是在设置了属性的情况下。我实际上是在使用接口来实现这一点,所以我更新了代码示例以反映这一点。问题是,如果我采用这种方法,我将为POCO创建接口,我想知道这样做是否正确,或者是否有其他方法来验证您建议的更改,我同意。第一种情况是,第一个代码块,
value.value
设置了作为参数的属性值(
toValue
)。第二个代码块有错误的代码,并且不会表示参数
toValue
的值。如果要验证对POCO所做的更改,请在调用该方法之前创建对象的实例,并在调用该方法之后验证更改。POCO的定义要简单明了,我不建议为对象创建接口我不确定我是否理解这一部分“当你断言对value.value所做的更改时,只有第一种情况会成功。”我明白我应该断言新的值,而不仅仅是属性被设置。我实际上是在使用接口进行断言,所以我更新了代码示例以反映这一点。问题是,如果我遵循这种方法,我将为POCO创建接口,我想知道这样做是否正确,或者是否有其他方法可以按照您的建议验证更改,我同意。在第一种情况下,
value.value
设置的第一个代码块的属性值为参数(
toValue
)。第二个代码块有错误的代码,并且不会表示参数
toValue
的值。如果要验证对POCO所做的更改,请在调用该方法之前创建对象的实例,并在调用该方法之后验证更改。POCO的定义要简单明了,我不建议为对象创建接口它们。只需实例化POCO。谢谢,您的答案和所选答案帮助我记住一些概念并解决问题。谢谢,您的答案和所选答案帮助我记住一些概念并解决问题。