gpt4 book ai didi

c# - 如何模拟采用动态对象的方法调用

转载 作者:可可西里 更新时间:2023-11-01 08:53:24 26 4
gpt4 key购买 nike

假设我有以下内容:

public interface ISession 
{
T Get<T>(dynamic filter); }
}

我有以下要测试的代码:

var user1 = session.Get<User>(new {Name = "test 1"});
var user2 = session.Get<User>(new {Name = "test 2"});

我将如何模拟这个调用?

使用最小起订量,我厌倦了这样做:

var sessionMock = new Mock<ISession>();
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 1});
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 2});

但这并没有奏效。返回结果为null

我还尝试使用 Rhino Mocks 执行以下操作:

var session = MockRepository.GenerateStub<ISession>();
session.Stub(x => x.Get<User>(new {Name = "test 1"})).Return(new User{Id=1});

也不走运。再次为空。

那我该怎么做呢?

谢谢,

最佳答案

您可以使用 It.Is<object>匹配器和反射。您不能在表达式树中使用动态,因此 It.Is<dynamic>行不通,这就是为什么您需要反射以按名称获取属性值的原因:

sessionMock
.Setup(x => x.Get<User>(
It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 1")))
.Returns(new User{Id = 1});
sessionMock
.Setup(x => x.Get<User>(
It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 2")))
.Returns(new User { Id = 2 });

在哪里GetPropertyValue是个小 helper :

public static class ReflectionExtensions
{
public static T GetPropertyValue<T>(this object obj, string propertyName)
{
return (T) obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}
}

关于c# - 如何模拟采用动态对象的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com