gpt4 book ai didi

.net - 如何使用 Moq 测试 lambda 函数?

转载 作者:行者123 更新时间:2023-12-01 04:16:02 24 4
gpt4 key购买 nike

有一个功能:

public class MyCacheClass : ICache
{
public void T GetObject<T>(Func<T> func)
{
T t;
...
t = func();
...
return t;
}
}

public class MyWorkClass : IWork
{
public Object MyWorkMethod(string value)
{
return new object();
}
}

这些函数的调用方式如下:
public class MyTestableClass 
{
public void MyTestableFunc(ICache cache, IWorkClass work)
{
string strVal="...";
...
Object obj = cache(()=>work.MyWorkMethod(strVal));
...
}
}

有必要为此编写一个 UnitTest(带 Moq)并检查是否将正确的参数传递给“MaCacheClass.GetObject”。

它应该是这样的:
[TestMethod]
public void MyTest()
{
Mock<ICache> mockCache = new Mock<ICache>();
Mock<IWorkClass> mockWorkClass = new Mock<IWorkClass>();

MyTestableClass testable = new MyTestableClass();
testable.MyTestableFunc(mockCache.Object, mockWorkClass.Object);

// should I check if 'MyCacheClass' was called with proper parameter?
mockCache.Verify(mock=>mock.GetObject(...)).Times.Once());
}

我如何提供适合“lambda 函数”的参数?
还有其他选择吗?

欢迎任何想法。

最佳答案

选项之一可能是:而不是在 Funct 参数上传递一些实现与“GetObject”函数接口(interface)的对象,例如:

public interface IGetObject
{
T GetObject<T>();
}

public class MyGetObject : IGetObject
{
public MyGetObject()
{
}

public void Init(string strVal, Func<string, T> func)
{
_strVal = strVal;
_func = func;
}

public T GetObject<T>()
{
return _func(_strVal);
}
}

public class MyCacheClass : ICache
{
public void T GetObject<T>(IGetObject getter)
{
T t;
...
t = getter.GetObject<T>();
...
return t;
}
}

public class MyTestableClass
{
public void MyTestableFunc(ICache cache, IWorkClass work)
{
string strVal="...";
IGetObject getter = UnityContainer.Resolve<IGetObject>();
getter.Init(strVal, str=>work.MyWorkMethod(str));
...
Object obj = cache.GetObject(getter);
...
}
}

在这种情况下,我想,我们还需要将 UnityContainer 注入(inject)到测试对象中,因此它将是这样的:
[TestMethod]
public void MyTest()
{
Mock<ICache> mockCache = new Mock<ICache>();
Mock<IWorkClass> mockWorkClass = new Mock<IWorkClass>();
Mock<IGetObject> mockGetter = new Mock<IGetObject>();

mockGetter.Setup(mock=>mock.GetObject()).Return(new Object());

MyTestableClass testable = new MyTestableClass();
testable.MyTestableFunc(mockCache.Object, mockWorkClass.Object);

// should I check if 'MyCacheClass' was called with proper parameter?
mockCache.Verify(mock=>mock.GetObject(mockGetter.Object)).Times.Once());
}

并为“MyCacheClass”的“GetObject”方法提供额外的测试,以检查它是否调用 IGetObject 参数的“GetObject”方法......

附言有点复杂的解决方案......所以,如果有人看到更好的解决方案,请指教!

关于.net - 如何使用 Moq 测试 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3752565/

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