在不传递新行为对象作为参数的情况下对C#类进行Mock。

问题描述 投票:0回答:1

比方说,我有一个C#方法,它做了一些类似的事情。

public void MyMethod()
{
   A a = new A();
   a.DoStuff();
}

有没有一种方法可以避免测试中的依赖注入,而不是传递一个... ... A 作为一个参数,以某种方式决定一个新的行为而不改变代码本身?我说的是一个伪代码。

public class B   
{
   public DoStuff() { //Same signature but does something else than A }
}


[TestMethod]
public void Test()
{
  SetBehavior(typeof A, typeof B);
  A a = new A();
  a.DoStuff(); //here B implementation will be called
}
c# mocking moq
1个回答
0
投票

我认为你应该在DoStuff()周围添加一个抽象,而你的 MyMethod 应避免初始化一个 A.

类似于:

public interface IDoer 
{
   void DoStuff();
}

public class A : IDoer
{
   void DoStuff()
   {
     // do your stuff here
   }
}

现在,在你的MyMethod中,你可以为IDoer添加一个额外的参数 或者在持有MyMethod的类中使用Dependency Injection。

所以,在你的Test项目中,你可以为IDoer添加额外的参数,或者在持有MyMethod的类中使用Dependency Injection。

public class MyClass
{
   private readonly IDoer _doer;
   public MyClass(IDoer doer)
   {
     _doer = doer;
   }

   public void MyMethod()
   {
     _doer.DoStuff();
   }
}

现在,在你的测试项目中,你可以定义你的B类作为IDoer的替代实现,并创建你的B类 MyClass 与此实例。或者,您可以使用 Moq 以提供任何你想要的行为来代替它.}。

© www.soinside.com 2019 - 2024. All rights reserved.