我是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/