验证是否使用Moq和Nunit动态调用方法

时间:2017-05-31 00:14:41

标签: c# nunit moq

我想动态验证是否正在调用类的特定方法,而不是基于传递的输入。

public interface ISample
{
  int GetNumber(string input);
  string GetString(string input);
}

public class A : ISample
{
 public int GetNumber(string input)
 {
   // some implementation
 }

 public int GetString(string input)
 {
   // some implementation
 }
}

public class B : ISample
{
 public int GetNumber(string input)
 {
   // some implementation different from A
 }

 public int GetString(string input)
 {
   // some implementation different from A
 }
}

public class CFactory
{
 public ISample GetObject(string decidingInput)
 {
  // return either A or B based on input
 }
}

有一个不同的类使用工厂来获取相应的对象,然后使用该对象在对象上调用GetNumberGetString方法。

public class InvokeMethodClass
{
public object invokeMethod(string decidingInput, string ifClause)
{
var iSample = new CFactory(decidingInput);
if(string.equals(ifClause, "int"))
{
return isample.GetNumber("something");
}
else
{
return isample.GetString("something");
}
}
}

假设界面中定义的方法类似于GetNumberGetString,并且每个方法都在类AB中实现。我想使用数据源对这些方法进行单元测试,而不是编写单独的测试来检查方法是否被调用。

Mock<ISample> _iSample = new Mock<ISample>();
[Test, TestCaseSource(nameof(_methodNames))]
public void SampleTest(string methodName)
{
var invokeMethodClass = new InvokeMethodClass();
var result = invokeMethodClass.invokeMethod("createA", "int");

// assert
Assert.NotNull(result);
// this works.
_iSample.verify(x => x.GetNumber(It.Is<string>()), Times.AtLeast(1));
// this is not working.
_iSample.verify(x => x.GetType().GetMethod("GetNumber").Invoke(new A()), Times.AtLeast(1));
}

我想使用设置中定义的数据源将方法名称传递给测试方法。尝试使用反射动态调用方法名称不起作用。

对于这个问题是否有更好的解决方案或使用反射来调用方法有什么问题?

0 个答案:

没有答案