gpt4 book ai didi

c# - RhinoMocks stub 具有简化的实现,尝试方法模式

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

我想用 RhinoMocks 模拟一个相当大的存储库,主要是为了完全实现一个巨大且经常变化的接口(interface),而不是使用 VisualStudio 的“实现接口(interface)”默认实现(这需要为接口(interface)更新所有模拟更改并导致大量垃圾代码)。

我目前使用 stub ,但我还没有找到如何覆盖模拟的默认方法,除了定义每个可能的输入值。这在使用 bool TryGet(key, out value) 模式时以及当我需要默认行为时尤其糟糕,如果找不到 key (这里:返回 false/null,在其他情况下:抛出异常)。

在RhinoMocks中有什么方法可以实现方法转发吗?

public interface IMyRepository
{
// would normally be implemented by database access
bool TryGetNameById(int id, out string name);

// more...
}

// within some other class:

public void SetupMockRepository()
{
IDictionary<int, string> namesByIds = new Dictionary<int, string>()
//create and fill with mock values

var mockRep = new MockRepository()
var repStub = mockRep.Stub<IMyRepository>()

// something like this, forward inner calls,
// without defining expected input values
var repStub.Stub(r => r.TryGetNameById(int id, out string name)
.OutRef((id) => (namesByIds.TryGetValue(id, out name) ? name : null))
.Return((id) => namesByIds.ContainsKey(id)));
}

编辑:

我现在尝试了一个delegate,看起来好多了,但是还是有问题:

private delegate bool TryGet<TKey, TValue>(TKey key, out TValue value);

public void SetupMockRepository()
{
// code from above omitted

string outName;
_stub.Stub(r=>r.TryGetNameById(0, out outName))
.IgnoreArguments()
.Do(new TryGet<int,string>(namesByIds.TryGetValue))
}

这是被接受的,但是当我运行它时,我得到一个 InvalidOperationException:“以前的方法 'TryGetValue(123)' 需要返回值或抛出异常”

最佳答案

您始终可以制作自己的假对象。通过混合模拟和部分模拟,您应该获得最大的灵 active 。

public interface IMyRepository
{
bool TryGetNameById(int id, out string name);
}

public class FakeRepository : IMyRepository
{
// public on purpose, this is for testing after all
public readonly Dictionary<int, string> nameByIds = new Dictionary<int, string>();

// important to make all methods/properties virtual that are part of the interface implementation
public virtual bool TryGetNameById(int id, out string name)
{
return this.nameByIds.TryGetValue(id, out name);
}
}

你的设置会变成这样:

public void Setup()
{
var mock = MockRepository.GeneratePartialMock<FakeRepository>();
mock.nameByIds.Add(1, "test");
}

如果您需要更复杂的行为,您仍然可以 stub 方法调用,因为所有方法都是虚拟的

关于c# - RhinoMocks stub 具有简化的实现,尝试方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30189700/

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