Существует механизм, встроенный в Moq для работы с несколькими интерфейсами.
Скажет, у нас есть интерфейс IFoo и реализация того же Foo. У нас также есть ClientOne, который использует IFoo.
тогда у нас есть интерфейс IFooBar: IFoo, реализация FooBar: Foo, IFooBar и ClientTwo, который использует IFooBar.
При создании теста от конца до конца для системы мы имеем IFooBar, ClientOne и ClientTwo. Как <>() функция позволяет использовать Mock <IFooBar> как Mock <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);
}
Есть ли связь между '' IUserRepository' и IGenericRepository'? Требуется ли, чтобы объект, реализующий «IUserRepository», также реализовал «IGenericRepository»? –
Как выглядит производственный код, который вы пытаетесь проверить? –