如何模拟以下类:
UserRepository : GenericRepository<User>, IUserRepository
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
Run Code Online (Sandbox Code Playgroud)
我正在使用Moq,我很困惑如何正确处理多个接口.
Shl*_*Emi 77
看看https://github.com/Moq/moq4/wiki/Quickstart
高级功能
// implementing multiple interfaces in mock
var foo = new Mock<IFoo>();
var disposableFoo = foo.As<IDisposable>();
// now IFoo mock also implements IDisposable :)
disposableFoo.Setup(df => df.Dispose());
Run Code Online (Sandbox Code Playgroud)
Ala*_*anT 24
Moq内置了一种机制来处理多个接口.
假设我们有一个接口IFoo和相同Foo的实现.我们还有使用IFoo的ClientOne.
然后,我们有一个接口IFooBar:IFoo的,实现FooBar的:美孚,IFooBar和ClientTwo使用IFooBar.
在为系统创建端到端测试时,我们有一个IFooBar,ClientOne和ClientTwo.的作为<>()函数允许我们使用的模拟<IFooBar>作为模拟<IFoo的>.
public interface IFoo {
int Id { get; }
}
public class Foo : IFoo {
public int Id {
get { return 1; }
}
}
public interface IFooBar : IFoo {
string Name { get; }
}
public class FooBar : Foo, IFooBar {
public string Name {
get { return "AName"; }
}
}
public class ClientOne {
private readonly IFoo foo;
public ClientOne(IFoo foo) {
this.foo = foo;
}
public string Details {
get { return string.Format("Foo : {0}", foo.Id); }
}
}
public class ClientTwo {
private readonly IFooBar fooBar;
public ClientTwo(IFooBar fooBar) {
this.fooBar = fooBar;
}
public string Details {
get { return string.Format("Foo : {0}, Bar : {1}", fooBar.Id, fooBar.Name); }
}
}
[TestMethod]
public void TestUsingBothClients() {
var fooBarMock = new Mock<IFooBar>();
var fooMock = fooBarMock.As<IFoo>();
fooBarMock.SetupGet(mk => mk.Id).Returns(1);
fooBarMock.SetupGet(mk => mk.Name).Returns("AName");
var clientOne = new ClientOne(fooMock.Object);
var clientTwo = new ClientTwo(fooBarMock.Object);
Assert.AreEqual("Foo : 1", clientOne.Details);
Assert.AreEqual("Foo : 1, Bar : AName", clientTwo.Details);
}
Run Code Online (Sandbox Code Playgroud)
如果我正确理解了这个问题,您需要有一个 的模拟实例UserRepository,并且为了测试的目的,设置对接口IGenericRepository<TEntity>和IUserRepository接口中方法的调用。
您可以使用单个模拟实例实现多个接口,如下所示:
var genericRepositoryMock = new Mock<IGenericRepository<User>>();
genericRepositoryMock.Setup(m => m.CallGenericRepositoryMethod()).Returns(false);
var userRepositoryMock = genericRepositoryMock.As<IUserRepository>();
userRepositoryMock.Setup(m => m.CallUserRepositoryMethod()).Returns(true);
Run Code Online (Sandbox Code Playgroud)
然而,正如 D Stanley 指出的那样,需要这样做可能表明您的设计存在缺陷。
| 归档时间: |
|
| 查看次数: |
20259 次 |
| 最近记录: |