我是Moq和学习的新手。

我需要测试一种方法是否返回预期的值。我整理了一个点头的例子来解释我的问题。不幸的是失败了:


“ ArgumentException:表达式不是方法调用:c =>(c.DoSomething(“ Jo”,“ Blog”,1)=“ OK”)”


你能纠正我做错了吗?

[TestFixtureAttribute, CategoryAttribute("Customer")]
public class Can_test_a_customer
{
    [TestAttribute]
    public void Can_do_something()
    {
        var customerMock = new Mock<ICustomer>();

        customerMock.Setup(c => c.DoSomething("Jo", "Blog", 1)).Returns("OK");

        customerMock.Verify(c => c.DoSomething("Jo", "Blog", 1)=="OK");
    }
}

public interface ICustomer
{
    string DoSomething(string name, string surname, int age);
}

public class Customer : ICustomer
{
    public string DoSomething(string name, string surname, int age)
    {
        return "OK";
    }
}


简而言之:如果我想测试上述方法,并且知道要返回“ OK”,我将如何使用Moq编写它?

感谢您的任何建议。

最佳答案

您需要一个与模拟对象进行交互的测试主题(除非您正在为Moq编写学习者测试。)我在下面写了一个简单的主题
您可以在模拟对象上设置期望值,指定确切的参数(严格-如果您愿意,则使用Is.Any<string>接受任何字符串),并指定返回值(如果有)
您的测试对象(作为测试的“ Act”步骤的一部分)将调用您的模拟
您断言测试对象的行为符合要求。模拟方法的返回值将由测试对象使用-通过测试对象的公共接口对其进行验证。
您还验证是否满足您指定的所有期望-实际上已经调用了您希望被调用的所有方法。




[TestFixture]
public class Can_test_a_customer
{
  [Test]
  public void Can_do_something()
  {
    //arrange
    var customerMock = new Moq.Mock<ICustomer>();
    customerMock.Setup(c => c.DoSomething( Moq.It.Is<string>(name => name == "Jo"),
         Moq.It.Is<string>(surname => surname == "Blog"),
         Moq.It.Is<int>(age => age == 1)))
       .Returns("OK");

    //act
    var result = TestSubject.QueryCustomer(customerMock.Object);

    //assert
    Assert.AreEqual("OK", result, "Should have got an 'OK' from the customer");
    customerMock.VerifyAll();
  }
}

class TestSubject
{
  public static string QueryCustomer(ICustomer customer)
  {
    return customer.DoSomething("Jo", "Blog", 1);
  }
}

关于moq - Moq:指定返回值作为期望的一部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1436757/

10-13 06:01