我有一个有趣的问题包围你的头.考虑一下这样的界面:
public interface IMyThing
{
int Id { get; }
}
Run Code Online (Sandbox Code Playgroud)
现在我想测试使用此接口的代码.也许有一些LINQ魔术.像这样的东西:
public class SomeClass
{
private IMyThing _thing;
...
public bool HasThing(IEnumerable<IMyThing> things)
{
return things.Contains(_thing);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在嘲笑所有IMyThing使用的对象Moq:
public static IMyThing MockMyThing(int newId)
{
var mock = new Mock<IMyThing>();
mock.Setup(s => s.Id).Returns(newId);
mock.Setup(s => s.Equals(It.IsAny<object>())).Returns<object>(obj =>
{
if (typeof(IMyThing).IsAssignableFrom(obj.GetType()))
{
return ((IMyThing)obj).Id == newId;
}
return false;
});
return mock.Object;
}
Run Code Online (Sandbox Code Playgroud)
这就是事情.上面的代码编译没有警告,但永远不会工作.Moq为Equals()方法创建一个拦截器,但永远不会到达.而是调用对象代理的equals方法.我谴责的事实是我在嘲笑一个界面而不是一个具体的类.
更新:刚刚意识到Moq甚至没有创建一个拦截器.
当然我可以IMyThing像这样扩充界面:
public interface IMyThing : IEquatable<IMyThing>
{
int Id { get; }
}
Run Code Online (Sandbox Code Playgroud)
LINQ运算符将识别该IEquatable<T>接口并使用它.
我不想这样做是因为:
IMyThing对象IEquatable<T> 不是为了这个目的你怎么解决这个问题?
| 归档时间: |
|
| 查看次数: |
1425 次 |
| 最近记录: |