Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对依赖于本地声明对象的c方法进行单元测试';什么样的行为?_C#_Unit Testing_Dependencies - Fatal编程技术网

C# 如何对依赖于本地声明对象的c方法进行单元测试';什么样的行为?

C# 如何对依赖于本地声明对象的c方法进行单元测试';什么样的行为?,c#,unit-testing,dependencies,C#,Unit Testing,Dependencies,我有一个c#方法,它依赖于它使用本地实例化的对象进行的服务调用的返回值。如何在不更改代码的情况下测试它。我知道依赖项注入会使其可测试,或者通过此方法将依赖项传递给将使其可测试,但这里的情况并非如此 我的方法如下所示: public class Animal { int Weight; public int CalculateActualWeight() { var weightFactory = new WeightFactory(); va

我有一个c#方法,它依赖于它使用本地实例化的对象进行的服务调用的返回值。如何在不更改代码的情况下测试它。我知道依赖项注入会使其可测试,或者通过此方法将依赖项传递给将使其可测试,但这里的情况并非如此

我的方法如下所示:

public class Animal
{ 
    int Weight;
    public int CalculateActualWeight()
    {
       var weightFactory = new WeightFactory();
       var weight = Weight + weightFactory.GetEatenAmount();
       return weight;
    }
}

要测试的方法是CalculateActualWeight()。

您可以使用Moq之类的方法伪造函数返回的结果。您可以设置它(它是您的测试),以便您的依赖项返回您告诉它返回的任何内容。然后,您可以测试依赖方法,知道另一个方法的结果是什么

var mock = new Mock<IYourClass>();
mock.Setup(m => m.Method()).Returns(true);
var mock=new mock();
Setup(m=>m.Method())。返回(true);

这将使您的方法()始终返回true,以便您可以测试其他方法

如果无法更改生产代码,那么测试它的唯一方法就是编写一个测试,围绕本地实例化的对象如何工作

您也可以使用
自存根
,但这不是推荐的做法,并且只有在被测对象具有可以模拟以替换所需功能的情况下才有效

例如:

[Test]
public void Test()
{
    //do stuff so that a "real" new WeightFactory() will return what you want
    //(this will require you to go figure out how the WeightFactory works), 
    //4 is just an example of your desired result
    SetUpSystemSoThatWeightFactoryProduces(4);

    var testAnimal = new Animal();
    testAnimal.Weight = 14;

    Assert.That(testAnimal.CalculateWeight(), Is.EqualTo(18));
}

这很好。请注意,只有在本地实例化的对象是在与被测试对象不同的函数中创建的情况下,is才会起作用。如果它们在同一个功能中,这将不起作用。是的,你是对的。我更新了我的问题,让它更清楚。他的编辑现在显示,该对象是在同一个函数中创建的。我唯一能说的是,编写代码时最好考虑可测试性。关于我的示例问题,您有这样的示例吗?WeigthFactory在CalculateActualWeight()中实例化。因此,我想不出任何方法来设置WeightFactory.GetEatenAmount()以返回我想要的内容,因为它是一个全新的对象,在被测试的方法中实例化。您不能将其删除。您必须查看该函数的实际实现,并尽一切努力设置“系统”,以使用实际代码从该函数调用返回您想要的值。您不能完全更改生产代码,或者只是不更改其外部接口吗?如果拉取
var weightFactory=new weightFactory()Animal
上,您可以在单元测试中自存根。这不是你最好的选择,但总比根本无法测试要好。