如何用FilterExpression输入参数模拟方法?

时间:2016-05-27 11:44:40

标签: c# unit-testing dynamics-crm-2011 moq

我正在尝试使用Moq来模拟方法,它将FilterExpression作为输入参数,到目前为止我没有运气。当我运行它时总是返回null。如果我通过NULL而不是FilterExpression,则可以正常工作。

这是我的代码:

存储库

public interface ITestRepository
{
string Test(int id, FilterExpression fe);
}

public class TestRepository : ITestRepository
{
        public stringTest(int id, FilterExpression fe)
        {
            throw new NotImplementedException();
        }
}

单元测试

var testMock = new Mock<ITestRepository>();
var fe = new FilterExpression();
var result = “Hello World”;
var  id = 1;

//DOESN’T WORK
testMock.Setup(r => r.Test(id, filterExpression)).Returns(result);

//WORKS
testMock.Setup(r => r.Test(id, null)).Returns(result);

//Test
[TestMethod]
public void test()
{
    var fe = new FilterExpression();
    var id = 1;        
    _testRepository.Test(id, fe);
    _testRepository.Test(id, null);       
}

3 个答案:

答案 0 :(得分:1)

参数不匹配。您使用不同的 FilterExpression 。您是否尝试过放置任何 FilterExpression

testMock.Setup(r => r.Test(id, It.IsAny<FilterExpression>())).Returns(result);

答案 1 :(得分:0)

您的设置应包含原始对象;在你的代码示例中它没有:

testMock.Setup(r => r.Test(id, filterExpression)).Returns(result);

testMock.Setup(r => r.Test(id, fe)).Returns(result);

根据你上面的测试。此外,您定义的测试对象的设置在哪里?这些也应该在测试中定义。

答案 2 :(得分:0)

如果您尝试单元测试Dynamics CRM代码,那么您是否尝试FakeXrmEasy

这是我自2014年以来一直在开发的一个开源项目,它自动为你调用IOrganizationService调用,包括你的FilterExpressions,还有任何QueryExpression(带有连接,过滤器,嵌套链接实体,order by),QueryByAttribute,FetchXml,主要的基本CRUD以及其他消息,如Associate,Disassociate,ExecuteMultiple,WhoAmIRequests等等......

它非常强大,它有800多个单元测试来测试测试框架本身(是的,meta是怎么回事?)和反馈,如this一个,非常好! :)

它定期帮助我每天,虽然它可以帮助其他CRM开发人员,也可以让社区的其他开发人员也可以贡献自己的改进和新功能(请这样做)。

它也可以作为NuGet包使用,这使得它非常容易上手。请查看文档页面here

我实际上开始在另一个存储库上工作,为来自Javascript的Web API调用做同样的事情。

坚持和谐快乐的测试!