首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSubstitute -传递给方法的检查参数

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

Stack Overflow用户
提问于 2015-07-09 11:47:45
回答 3查看 15.6K关注 0票数 22

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

我有一个方法,它接受DatabaseParams类型的对象。该类具有以下结构(简化):

代码语言:javascript
复制
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;
    }
  }

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

代码语言:javascript
复制
public interface IHelper
{
Task<object> ExecuteScalarProcedureAsync(DatabaseParams data);
}

如何用正确的值测试将DatabaseParams的实例传递到该方法中?

我可以在RhinoMocks中这样做:

代码语言:javascript
复制
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));

helperMock正在模拟包含ExecuteScalarProcedureAsync方法的接口IHelper

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-09 12:00:19

我自己想出了答案。

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

例如:

代码语言:javascript
复制
  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"));
票数 27
EN

Stack Overflow用户

发布于 2019-05-22 19:14:11

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

代码语言:javascript
复制
StoredProc sp = null; // Guessing the type here

// Setup Do to capture arg
helperMock.ExecuteScalarProcedureAsync(Arg.Do<DatabaseParams>(p => sp = p));

// Call method
helperMock.ExecuteScalarProcedureAsync(dbParams);

// 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());
票数 20
EN

Stack Overflow用户

发布于 2019-09-26 08:10:33

聚会有点晚了,但也遇到了同样的需要。我正在使用java中的mockito,他们有一个我喜欢的参数捕获助手。这与“Castrohenge”的回答基本相同。

下面是我的NSubstitute实现。

代码语言:javascript
复制
public interface IFoo
{
    void DoSomthing(string stringArg);
}

参数捕获类

代码语言:javascript
复制
public class ArgCapture<T>
{
    private List<T> m_arguments = new List<T>();

    public T capture()
    {
        T res = Arg.Is<T>(obj => add(obj)); // or use Arg.Compat.Is<T>(obj => add(obj)); for C#6 and lower
        return res;
    }

    public int Count
    {
        get { return m_arguments.Count; }
    }

    public T this[int index]
    {
        get { return m_arguments[index]; }
    }

    public List<T> Values {
        get { return new List<T>(m_arguments);}
    }

    private bool add(T obj)
    {
        m_arguments.Add(obj);
        return true;
    }
}

以及使用测试用例

代码语言:javascript
复制
    [Test]
    public void ArgCaptureTest()
    {
        IFoo foo1 = Substitute.For<IFoo>();
        ArgCapture<string> stringArgCapture = new ArgCapture<string>();
        foo1.DoSomthing("firstCall");
        foo1.DoSomthing("secondCall");
        foo1.Received(2).DoSomthing(stringArgCapture.capture());
        Assert.AreEqual(2,stringArgCapture.Count);
        Assert.AreEqual("firstCall",stringArgCapture[0]);
        Assert.AreEqual("secondCall", stringArgCapture[1]);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31316550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档