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

C# 验证是否使用Moq和Nunit动态调用方法,c#,nunit,moq,C#,Nunit,Moq,我想根据传递的输入动态验证是否调用了类的特定方法 公共接口很简单 { int GetNumber(字符串输入); 字符串GetString(字符串输入); } 公共A类:我很简单 { public int GetNumber(字符串输入) { //一些实现 } public int GetString(字符串输入) { //一些实现 } } 公共B类:我很简单 { public int GetNumber(字符串输入) { //某些实现不同于 } public int GetString(字符串

我想根据传递的输入动态验证是否调用了类的特定方法

公共接口很简单
{
int GetNumber(字符串输入);
字符串GetString(字符串输入);
}
公共A类:我很简单
{
public int GetNumber(字符串输入)
{
//一些实现
}
public int GetString(字符串输入)
{
//一些实现
}
}
公共B类:我很简单
{
public int GetNumber(字符串输入)
{
//某些实现不同于
}
public int GetString(字符串输入)
{
//某些实现不同于
}
}
公营工厂
{
公共ISample GetObject(字符串判定输入)
{
//根据输入返回A或B
}
}
有一个不同的类使用factory获取相应的对象,然后使用该对象调用对象上的
GetNumber
GetString
方法

public类InvokeMethodClass
{
公共对象invokeMethod(string DecingInput,string ifClause)
{
var iSample=新工厂(决策输入);
if(string.equals(if子句,“int”))
{
返回isample.GetNumber(“某物”);
}
其他的
{
返回isample.GetString(“某物”);
}
}
}
假设在接口中定义了许多类似于
GetNumber
GetString
的方法,并且这些方法中的每一个都在类
A
B
中实现。我希望使用数据源对这些方法进行单元测试,而不是编写单独的测试来检查是否调用了某个方法

Mock_iSample=new Mock();
[Test,TestCaseSource(nameof(_methodNames))]
public void SampleTest(字符串方法名)
{
var invokeMethodClass=新invokeMethodClass();
var result=invokeMethodClass.invokeMethod(“createA”、“int”);
//断言
Assert.NotNull(结果);
//这很有效。
_iSample.verify(x=>x.GetNumber(It.Is()),Times.atlast(1));
//这是行不通的。
_iSample.verify(x=>x.GetType().GetMethod(“GetNumber”).Invoke(newa()),Times.atlast(1));
}
我想使用设置中定义的数据源将方法名传递给测试方法。尝试使用反射动态调用方法名是无效的


对于这个问题有更好的解决方案吗?或者使用反射调用该方法有什么错??

Moq与表达式一起工作。直接使用反射不会像您已经发现的那样起作用。您可以考虑根据成员名称动态构建表达式树,但这项工作太多了。另一个选项是传入表达式,而不仅仅是名称。还考虑将工厂抽象并将其作为依赖关系注入到受试对象中。测试中未使用当前模拟。
我希望使用数据源对这些方法进行单元测试,而不是编写单独的测试来检查是否调用了某个方法。
为什么?你怎么知道哪个被呼叫,哪个没有被呼叫?单元测试应该是直截了当且易于编写的。@CodingYoshi
为什么?
这是因为我不想反复编写相同的代码来检查是否调用了每个方法<代码>如何知道调用的是哪一个?。如果您查看
CFactory
类,它有
GetObject
,它接受一些输入并给出相应的对象。是的,我同意单元测试应该很容易编写,但问题是我不想编写重复的代码。