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

c# unit-testing dynamics-crm-2011 moq

133 观看

3回复

465 作者的声誉

我正在尝试使用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);       
}
作者: German 的来源 发布者: 2016 年 5 月 27 日

回应 (3)


1

164 作者的声誉

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

testMock.Setup(r => r.Test(id, It.IsAny<FilterExpression>())).Returns(result);
作者: pw94 发布者: 27.05.2016 11:52

0

44655 作者的声誉

您的设置应包含原始对象。在您的代码示例中,它不会:

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

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

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

作者: Brian Mains 发布者: 27.05.2016 11:57

0

1355 作者的声誉

如果您要对Dynamics CRM代码进行单元测试,那么您是否尝试过FakeXrmEasy

自2014年以来,这是一个我一直在致力于的开源项目,它会自动为您模拟IOrganizationService调用,包括您的FilterExpression,还包括任何QueryExpression(带有联接,过滤器,嵌套的链接实体,排序依据),QueryByAttribute,FetchXml,主要的基本CRUD以及其他消息,如关联,取消关联,ExecuteMultiple,WhoAmIRequests等,依此类推...

它确实很健壮,它具有800多个单元测试来测试测试框架本身(是的,这是什么meta?),并且像这样的反馈非常好!:)

它绝对可以每天为我提供帮助,尽管可以通过开源将其帮助其他CRM开发人员,也可以使社区中的其他开发人员也可以贡献自己的改进和新功能(请这样做)。

它也可以作为NuGet包提供,这使得上手非常容易。请在此处查看文档页面。

我实际上开始在另一个存储库上工作,以对Javascript中的Web API调用执行相同的操作。

敬请期待,测试愉快!

作者: Jordi 发布者: 28.05.2016 11:27
32x32