NSubstitute - 检查传递给方法的参数

JBo*_*ond 9 c# mocking nsubstitute

我们目前正在从RhinoMocks迁移到NSubstitute.

我有一个采用类型对象的方法DatabaseParams.该类具有以下结构(简化):

public class DatabaseParams
  {
    public string StoredProcName { get; private set; }
    public SqlParameter[] Parameters { get; private set; }

    public DatabaseParams(string storeProcName, SqlParameter[] spParams)
    {
      StoredProcName = storeProcName;
      Parameters = spParams;
    }
  }
Run Code Online (Sandbox Code Playgroud)

我有以下方法我想检查传递给它的参数是否正确:

public interface IHelper
{
Task<object> ExecuteScalarProcedureAsync(DatabaseParams data);
}
Run Code Online (Sandbox Code Playgroud)

如何DatabaseParams使用正确的值测试传递给该方法的实例?

我可以在RhinoMocks中用这样的方法做到这一点:

helperMock.Expect(m => m.ExecuteScalarProcedureAsync(Arg<DatabaseHelperParameters>.Matches(
        p =>   p.StoredProcName == "up_Do_Something"
            && p.Parameters[0].ParameterName == "Param1"
            && p.Parameters[0].Value.ToString() == "Param1Value"
            && p.Parameters[1].ParameterName == "Param2"
            && p.Parameters[1].Value.ToString() == "Param2Value"
        ))).Return(Task.FromResult<DataSet>(null));
Run Code Online (Sandbox Code Playgroud)

正在模拟包含该方法helperMock的接口.IHelperExecuteScalarProcedureAsync

JBo*_*ond 14

我自己已经找到了答案.

NSubstitute只需要使用.Received()调用,然后指定方法的参数.您可以将参数匹配指定为谓词.

例如:

  helperMock.Received().ExecuteScalarProcedureAsync(Arg.Is<DatabaseParams>(
   p =>   p.StoredProcName == "up_Do_Something"
        && p.Parameters[0].ParameterName == "Param1"
        && p.Parameters[0].Value.ToString() == "Param1Value"
        && p.Parameters[1].ParameterName == "Param2"
        && p.Parameters[1].Value.ToString() == "Param2Value"));
Run Code Online (Sandbox Code Playgroud)


Cas*_*nge 13

另一种方法是使用Do(参见https://nsubstitute.github.io/help/actions-with-arguments/)。我更喜欢这个,因为它允许您针对参数的特定属性调用断言,这可以为您提供关于参数对象的哪些特定属性不正确的更好的反馈。例如:

StoredProc sp = null; // Guessing the type here

helperMock.Received().ExecuteScalarProcedureAsync(Arg.Do<DatabaseParams>(p => sp = p));

// NUnit assertions, but replace with whatever you want.
Assert.AreEqual("up_Do_Something", sp.StoredProcName);
Assert.AreEqual("Param1", p.Parameters[0].ParameterName);
Assert.AreEqual("Param1Value", p.Parameters[0].Value.ToString());
Assert.AreEqual("Param2", p.Parameters[1].ParameterName);
Assert.AreEqual("Param2Value", p.Parameters[1].Value.ToString());
Run Code Online (Sandbox Code Playgroud)

  • 非常好的解决方案!对我来说,这样设置时不起作用。我必须首先设置 `helperMock.ExecuteScalarProcedureAsync(Arg.Do&lt;DatabaseParams&gt;(p =&gt; sp = p));` (即没有 `Received()` 部分)。然后,稍后,当调用“ExecuteScalarProcedureAsync()”时,将设置“sp”。 (3认同)