В моей ситуации, было все просто: метод Clone должен возвращать объект (которого на самом деле нет), с наперед известными данными (которые не подлежали бы изменениям). Для наглядности лучше привести исходный код.
Пусть это будет следующий интерфейс:
public interface ISome : ICloneable
{
// некое бизнес-поле
int Value { get; }
}
Итак, тесты вперед, поэтому напишем простой unit-test для метода Clone:
[TestMethod]
public void CloneTest()
{
var original = MakeMockCloneableSome();
// покажем, что и у клонированого объекта
// метод Clone работает как надо
var clone = (ISome)((ISome)((ISome)original.Clone()).Clone()).Clone();
// проверим, что бизнес поле совпадает
Assert.AreEqual(original.Value, clone.Value);
// проверим, что это 2 отдельных объекта
Assert.IsFalse(Object.ReferenceEquals(original, clone));
}
Осталось реализовать метод MakeMockCloneableSome():
ISome MakeMockCloneableSome()
{
var mock = new Mock<ISome>();
// Здесь привычный нам mock бизнес логики...
mock
.Setup(c => c.Value)
.Returns(123);
// Искомый mock метода ICloneable.Clone()
mock
.Setup(c => c.Clone())
.Returns(MakeMockCloneableSome);
return mock.Object;
}