相关疑难解决方法(0)

使用Moq验证方法调用

我对C#中的单元测试相当新,并且学习使用Moq.以下是我要测试的课程.

class MyClass
{
    SomeClass someClass;
    public MyClass(SomeClass someClass)
    {
        this.someClass = someClass;     
    }

    public void MyMethod(string method)
    {
        method = "test"
        someClass.DoSomething(method);
    }   
}

class Someclass
{
    public DoSomething(string method)
    {
        // do something...
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我的TestClass:

class MyClassTest
{
    [TestMethod()]
    public void MyMethodTest()
    {
        string action="test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
        mockSomeClass.SetUp(a => a.DoSomething(action));
        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);
        mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

Expected invocation on the mock at least once, but was never performed …
Run Code Online (Sandbox Code Playgroud)

c# testing methods moq

117
推荐指数
1
解决办法
14万
查看次数

NSubstitute - 收到异步 - "等待呼叫"警告

我试图验证使用正确的参数调用异步方法.但是,我得到警告:

"因为没有等待这个调用,所以当前方法的执行在调用完成之前继续.考虑将'await'运算符应用于调用的结果".此警告显示在//Assert注释下方的代码行上(下方).

我使用NSubstitute的测试如下:

[Test]
public async Task SimpleTests()
{
  //Arrange
  var request = CreateUpdateItemRequest();

  databaseHelperSub.ExecuteProcAsync(Arg.Any<DatabaseParams>()).Returns(Task.FromResult((object)null));

  //Act      
  await underTest.ExecuteAsync(request);

  //Assert
  databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
    p => p.StoredProcName == StoredProcedureName
         && p.Parameters[0].ParameterName == "Param1"
         && p.Parameters[0].Value.ToString() == "Value1"
         && p.Parameters[1].ParameterName == "Param2"
         && p.Parameters[1].Value.ToString() == "Value2"));
}
Run Code Online (Sandbox Code Playgroud)

被测单元方法underTest.ExecuteAsync(request)调用ExecuteProcedureAsync并执行await:

var ds = await DatabaseHelper.ExecuteProcAsync(dbParams);
Run Code Online (Sandbox Code Playgroud)

由于使用NSubstitute,在执行被测单元后需要Received().而在RhinoMocks中,您可以预期在执行测试单元之前进行调用.RhinoMocks可以返回Task.FromResult()而NSubstitute不能.

RhinoMocks等效的工作原理如下:

[Test]
        public async Task SimpleTest()
        {
            // Arrange
            var request = new UpdateItemRequest();

            databaseHelperMock.Expect(m => m.ExecuteProcAsync(Arg<DatabaseParams>.Matches(
                p =>   p.StoredProcName == …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing asynchronous nsubstitute async-await

23
推荐指数
2
解决办法
1万
查看次数