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

时间:2014-02-28 19:10:46

标签: c# unit-testing dependencies

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

我的方法看起来像这样:

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

要测试的方法是CalculateActualWeight()。

2 个答案:

答案 0 :(得分:1)

您可以使用Moq之类的东西伪造函数的返回结果。你可以设置它(它是你的测试),以便你的依赖返回你告诉它返回的任何东西。然后,您可以测试依赖方法,了解其他方法的结果。

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

这将使您的Method()始终返回true,以便您可以测试另一个。 More info on Moq here.

答案 1 :(得分:1)

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

您也可以使用self stubbing,但这不是推荐的做法,只有在测试对象具有可以模拟的功能以替换您需要的功能时才会起作用。

示例:

[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));
}