首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过machine.fakes模拟多个接口

通过machine.fakes模拟多个接口
EN

Stack Overflow用户
提问于 2015-01-13 17:37:17
回答 1查看 885关注 0票数 0

我如何才能获得相当于

代码语言:javascript
复制
Substitute.For<DbSet<MyClass>, IQueryable<MyClass>, IDbAsyncEnumerable>()

和machine.fakes?我试着用

代码语言:javascript
复制
var myFake = An<DbSet<MyClass>>();
myFake.WhenToldTo(m => ((IQueryable<MyClass>)m).Provider).Return(whatever);

但我得到了以下NotImplementedException:

代码语言:javascript
复制
The member 'IQueryable.Provider' has not been implemented on type 'DbSet`1Proxy' which 
inherits from 'DbSet`1'. Test doubles for 'DbSet`1' must provide implementations of 
methods and properties that are used.

myFake.WhenToldTo(m => ((IQueryable)m).Provider).Return(无论如何)也会引发相同的异常;

这是一个用最少代码复制问题的类。您需要添加实体框架、Machine.Specifications、Machie.Specifications.Should、Machine.Fakes、Machine.Fakes.NSubstitute、NSubstitute (或任何其他模拟框架插件)的包。

代码语言:javascript
复制
using System.Data.Entity;
using System.Linq;
using Machine.Fakes;
using Machine.Specifications;

namespace SpecsTests
{
    public class TestClass
    {}

    [Subject("Test")]
    internal class TestSpecifications
    {
        [Subject("Test")]
        private class Test : WithFakes
        {
            private static int Count;
            private static DbSet<TestClass> Subject;

            private Establish context = () =>
                                        {
                                            var data = new [] { new TestClass() }.AsQueryable();
                                            Subject = An<DbSet<TestClass>>();

                                            Subject.WhenToldTo(m => ((IQueryable)m).Provider).Return( data.Provider);
                                        };

            private Because of = () => { Count = Subject.Count(); };

            private It Should_return_expected_results = () =>
                                                        {
                                                            Count.ShouldEqual(1);
                                                        };

        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 08:40:29

没有办法在一个假的Machine.Fakes中伪造多个接口--相当于NSub妓女的Substitute.For<>()。我认为你有两种选择:

  1. 直接使用NSubstitute。 你总能做到 Subject = Substitute.For<DbSet<TestClass>, IQueryable<TestClass>>(); 而不是 Subject = An<DbSet<TestClass>>(); 缺点是您放弃了独立于底层的模拟框架和机器。
  2. 重新构造代码,一次只伪造一个接口。这将是我的首选选择。 我对此的第一次尝试是伪造IDbSet<>而不是DbSet<>,并且只对这个接口工作。然而,我对你试图实现的目标知之甚少,无法给出更详细的提示。作为一般规则,您应该始终尝试依赖于接口。也许您可以使被测试的类独立于具体的DbSet<>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27928113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档