C# 测试对象是否使用正确的参数值实例化

C# 测试对象是否使用正确的参数值实例化,c#,unit-testing,moq,C#,Unit Testing,Moq,我正在用Moq和Nunit对C#代码进行单元测试,我想测试下面的简化方法。就单元测试而言,我认为我不应该检查foo值,因为FooClass可能会发生更改,并在将来破坏我的测试。因此,我至少可以验证所有内容都得到了正确的初始化和调用,也就是说,someContainer得到了正确的值,FooClass得到了someContainer,而不是其他MyContainer实例。我该怎么做?这种(单元)测试方法正确吗 public MyClass { ... public bool MyMet

我正在用Moq和Nunit对C#代码进行单元测试,我想测试下面的简化方法。就单元测试而言,我认为我不应该检查foo值,因为FooClass可能会发生更改,并在将来破坏我的测试。因此,我至少可以验证所有内容都得到了正确的初始化和调用,也就是说,someContainer得到了正确的值,FooClass得到了someContainer,而不是其他MyContainer实例。我该怎么做?这种(单元)测试方法正确吗

public MyClass
{
   ...
   public bool MyMethod(int a, int b, int c, out FooClass foo)
   {
      var someContainer = new MyContainer{
         A = a,
         B = b,
         C = c
      };

      foo = new FooClass(someContainer,1,2,3);

      ...
      return true;
   }
   ...
}

您无法测试
foo
是否获取
someContainer
,因为
someContainer
只能从方法内部访问。该方法的一个适当测试是
foo
在正确的位置包含
a
b
c
,并且它包含一些
MyContainer
对象。这将是对
FooClass
构造函数的单元测试,该构造函数测试
FooClass
对象是否包含正确的
MyContainer
对象


如果您的
FooClass
将要更改,那么您的
MyMethod
可能也会更改,因此对
MyMethod
的任何测试也必须更改。它破坏了您的测试这一事实是好的,因为这意味着您需要查看该方法,并确保该方法符合您的要求,并且您正在测试它是否符合您的要求。您应该现在就为方法编写正确的测试,或者在
FooClass
完成之前根本不需要编写任何测试。

您不能测试
foo
是否获得
someContainer
,因为
someContainer
只能从方法内部访问。该方法的一个适当测试是
foo
在正确的位置包含
a
b
c
,并且它包含一些
MyContainer
对象。这将是对
FooClass
构造函数的单元测试,该构造函数测试
FooClass
对象是否包含正确的
MyContainer
对象


如果您的
FooClass
将要更改,那么您的
MyMethod
可能也会更改,因此对
MyMethod
的任何测试也必须更改。它破坏了您的测试这一事实是好的,因为这意味着您需要查看该方法,并确保该方法符合您的要求,并且您正在测试它是否符合您的要求。您应该现在就为方法编写正确的测试,或者在
FooClass
完成之前根本不需要编写任何测试。

您不能测试
foo
是否获得
someContainer
,因为
someContainer
只能从方法内部访问。该方法的一个适当测试是
foo
在正确的位置包含
a
b
c
,并且它包含一些
MyContainer
对象。这将是对
FooClass
构造函数的单元测试,该构造函数测试
FooClass
对象是否包含正确的
MyContainer
对象


如果您的
FooClass
将要更改,那么您的
MyMethod
可能也会更改,因此对
MyMethod
的任何测试也必须更改。它破坏了您的测试这一事实是好的,因为这意味着您需要查看该方法,并确保该方法符合您的要求,并且您正在测试它是否符合您的要求。您应该现在就为方法编写正确的测试,或者在
FooClass
完成之前根本不需要编写任何测试。

您不能测试
foo
是否获得
someContainer
,因为
someContainer
只能从方法内部访问。该方法的一个适当测试是
foo
在正确的位置包含
a
b
c
,并且它包含一些
MyContainer
对象。这将是对
FooClass
构造函数的单元测试,该构造函数测试
FooClass
对象是否包含正确的
MyContainer
对象

如果您的
FooClass
将要更改,那么您的
MyMethod
可能也会更改,因此对
MyMethod
的任何测试也必须更改。它破坏了您的测试这一事实是好的,因为这意味着您需要查看该方法,并确保该方法符合您的要求,并且您正在测试它是否符合您的要求。您应该现在就为方法编写正确的测试,或者在
FooClass
完成之前根本不需要编写任何测试

这种(单元)测试方法正确吗

public MyClass
{
   ...
   public bool MyMethod(int a, int b, int c, out FooClass foo)
   {
      var someContainer = new MyContainer{
         A = a,
         B = b,
         C = c
      };

      foo = new FooClass(someContainer,1,2,3);

      ...
      return true;
   }
   ...
}
如果您想模拟依赖项,以便测试代码的特定单元(例如示例中的
MyClass
),那么您需要考虑将代码组合到负责不同职责的服务中。在您的示例中,您的
MyMethod
有几个职责:

  • 创建新的
    MyContainer
  • 创建新的
    FooClass
  • 提供创建
    FooClass
    时应使用的
    MyContainer
    实例
  • 为了满足您测试
    MyMethod
    是否将特定的
    MyContainer
    传递到
    FooClass
    的愿望,您可以将职责1和职责2分离到新的类中。通常,在C#中,您会给这些类一个接口,并让
    MyClass
    将这些接口中的每一个作为依赖项。例如

    公共接口IFooClassProvider
    {
    FooClass CreateFooClass(MyContainer容器,int d,int e,int f);
    }
    公共接口IMyContainerProvider
    {
    MyContainer CreateMContainer(内部a、内部b、,