我如何才能获得相当于
Substitute.For<DbSet<MyClass>, IQueryable<MyClass>, IDbAsyncEnumerable>()和machine.fakes?我试着用
var myFake = An<DbSet<MyClass>>();
myFake.WhenToldTo(m => ((IQueryable<MyClass>)m).Provider).Return(whatever);但我得到了以下NotImplementedException:
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 (或任何其他模拟框架插件)的包。
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);
};
}
}
}发布于 2015-01-20 08:40:29
没有办法在一个假的Machine.Fakes中伪造多个接口--相当于NSub妓女的Substitute.For<>()。我认为你有两种选择:
Subject = Substitute.For<DbSet<TestClass>, IQueryable<TestClass>>();
而不是
Subject = An<DbSet<TestClass>>();
缺点是您放弃了独立于底层的模拟框架和机器。IDbSet<>而不是DbSet<>,并且只对这个接口工作。然而,我对你试图实现的目标知之甚少,无法给出更详细的提示。作为一般规则,您应该始终尝试依赖于接口。也许您可以使被测试的类独立于具体的DbSet<>。https://stackoverflow.com/questions/27928113
复制相似问题