如何使用Moq使用依赖注入设置伪代理(错误转换可查询)

时间:2017-06-06 03:05:52

标签: unit-testing dependency-injection entity-framework-6 moq xunit

如何使用Moq设置数据可查询数据

  1. 我有责任(IMediaCoverageReponsitory)。

    public interface IMediaCoverageRepository : RepositoryAsync<MediaCoverage>
    
  2. 我使用Moq创建Moq IMediaCoverageRepository

    var mockFactory = new MockRepository(MockBehavior.Strict) { 
        DefaultValue = DefaultValue.Mock
    };
    var mockMediaRepository = mockFactory.Create<IMediaCoverageRepository>();
    
  3. 我有一个列表示例:

    var listOfMediaCoverages = new List<MediaCoverage>()
    {
        new MediaCoverage { MediaCoverageId = 1, Name = "Media 10", IsActive = true },
        new MediaCoverage {MediaCoverageId = 2, Name = "Media 100", IsActive = true },
        new MediaCoverage {MediaCoverageId = 3, Name = "Media 1000", IsActive = false }
    };
    
  4. 之后,我使用listOfMediaCoverage Fake Into Mock MediaCoverageRepository设置数据

    var queryableListMediaCoverage = listOfMediaCoverages.ToArray().AsQueryable();
    

    mockMediaRepository.Setup(r => r.Queryable(null).GetEnumerator()).Returns(queryableListMediaCoverage.GetEnumerator());
    mockMediaRepository.Setup(r => r.Queryable(null).Provider).Returns(queryableListMediaCoverage.Provider);
    mockMediaRepository.Setup(r => r.Queryable(null).ElementType).Returns(queryableListMediaCoverage.ElementType);
    mockMediaRepository.Setup(r => r.Queryable(null).Expression).Returns(queryableListMediaCoverage.Expression);
    
  5.   

    ==&GT;我收到错误:   **无法转换

    类型的对象
    'System.Linq.EnumerableQuery`1[Pacman2.Core.Entities.MediaCoverage]' to type 'Moq.IMocked'.**
    

    请帮我解决这个问题。我已经在google上搜索并在此链接上尝试解决方案,但无法解决问题

    <links>
         http://davidcondemarin.blogspot.com/2012/07/testing-sarp-lite-repositories-with-moq.html
    </links>
    
    • 注意:
    • r =&gt; r.Queryable(null)方法是否返回IQueryable

2 个答案:

答案 0 :(得分:0)

mockMediaRepository.As<IQueryable<MediaCoverage>>().Setup(m => m.Provider).Returns(queryableListMediaCoverage.Provider);
mockMediaRepository.As<IQueryable<MediaCoverage>>().Setup(m => m.Expression).Returns(queryableListMediaCoverage.Expression);
mockMediaRepository.As<IQueryable<MediaCoverage>>().Setup(m => m.ElementType).Returns(queryableListMediaCoverage.ElementType);
mockMediaRepository.As<IQueryable<MediaCoverage>>().Setup(m => m.GetEnumerator()).Returns(queryableListMediaCoverage.GetEnumerator());

答案 1 :(得分:0)

我用这段代码解决了 mockMediaRepository.Setup(r => r.Queryable(It.IsAny())).Returns(queryableListMediaCoverage)

==&GT;代号是我想填充方法Queryable,返回IQueryable。而且Moq已经为我填充了它。