我想使用Foq模拟一个entityframwork DbSet
。它类似于:
let patients =
([
Patient(Guid "00000000-0000-0000-0000-000000000001");
Patient(Guid "00000000-0000-0000-0000-000000000002");
Patient(Guid "00000000-0000-0000-0000-000000000003");
]).AsQueryable()
let mockPatSet = Mock<DbSet<Patient>>.With(fun x ->
<@
// This is where things wrong. x doesn't have a property Provider
x.Provider --> patients.Provider
@>
)
我尝试在某些地方强制x
加注IQueryable
,但这不起作用。
正如您在DbSet
的文档中看到here一样,它确实通过IQueryable
实现了DbQuery
接口,但明确地&#34;实施这些属性。
Moq是否有As
函数,因此您可以告诉它将其视为IQueryable
,如下所示:
var mockSet = new Mock<DbSet<Blog>>();
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
答案 0 :(得分:3)
最新版本的Foq(1.7)现在支持使用Mock.As
方法实现多个接口,类似于Moq中的设置,例如。
type IFoo =
abstract Foo : unit -> int
type IBar =
abstract Bar : unit -> int
[<Test>]
let ``can mock multiple interface types using setup`` () =
let x =
Mock<IFoo>().Setup(fun x -> <@ x.Foo() @>).Returns(2)
.As<IBar>().Setup(fun x -> <@ x.Bar() @>).Returns(1)
.Create()
Assert.AreEqual(1, x.Bar())
Assert.AreEqual(2, (x :?> IFoo).Foo())