gpt4 book ai didi

c# - 如何使用 LINQ 表达式从模拟存储库返回新对象?

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:07 25 4
gpt4 key购买 nike

我正在使用 Rhino Mocks 并创建了一个 Mock Repository。

var salesForcePolicies = MockRepository.GenerateMock<IRepository<SalesForcePolicy>>();

我有一个私有(private)方法可以从存储库返回一个policy 项。

private SalesForcePolicy GetSalesForcePolicyByClientId(decimal clientId)
{
var policy = salesForcePolicies.FindByExp(x => x.IdNumber == clientId).FirstOrDefault();
if (policy == null) throw new AccountUpdaterException("Policy Not Found in Sales Force Lookup Table.");
return policy;
}

当在 private 方法中调用查询时,我试图让存储库返回一个具有一个属性集的新对象。我不想破坏封装并设置为public virtual

当我写这个的时候编译器在尖叫......

var clientId = decimal.Parse("123456");
salesForcePolicies.Stub(x => x.FindByExp(y => y.IdNumber == clientId)).Return(new SalesForcePolicy { PolicyNumber = "123456" });

如何让这个模拟存储库在被查询时返回一个新对象?

Error: The best overloaded method match for 'Rhino.Mocks.Interfaces.IMethodOptions<System.Linq.IQueryable<Data.Models.Ussi.SalesForcePolicy>>.Return(System.Linq.IQueryable<Data.Models.Ussi.SalesForcePolicy>)' has some invalid arguments.

最佳答案

这样做的技巧是为表达式参数传入 null,然后使用 .IgnoreArguments()。为返回创建一个 new List<T>() 并调用 .AsQueryable()

[TestMethod]
public void Can_Mock_Sales_Force_Repo()
{
// arrange
var salesForcePolicyRepo = MockRepository.GenerateMock<IRepository<SalesForcePolicy>>();

// act
var clientId = decimal.Parse("123456");
var salesForcePolicy = new SalesForcePolicy { PolicyNumber = "123456" };
IEnumerable<SalesForcePolicy> salesForcePolicies = new List<SalesForcePolicy> { salesForcePolicy };
salesForcePolicyRepo.Stub(x => x.FindByExp(null)).IgnoreArguments().Return(salesForcePolicies.AsQueryable());
var policy = salesForcePolicyRepo.FindByExp(x => x.IdNumber == clientId).FirstOrDefault();

// assert
Assert.IsTrue(policy == salesForcePolicy);
}

关于c# - 如何使用 LINQ 表达式从模拟存储库返回新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535946/

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