- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
开始之前,我是 AutoFixture 的忠实粉丝,我仍在学习如何使用该工具。因此,感谢 Ploeh 先生和所有贡献者开发了 Autofixture。
那么让我们从我的问题开始吧。
根据 AutoFixture/AutoMoq ignores injected instance/frozen mock
上面链接中有趣的部分给出了这段代码
Mock<ISettings> settingsMock = new Mock<ISettings>();
settingsMock.Setup(s => s.Get(settingKey)).Returns(xmlString);
ISettings settings = settingsMock.Object;
fixture.Inject(settings);
可以改写到哪个Mark答案
fixture.Freeze<Mock<ISettings>>()
.Setup(s => s.Get(settingKey)).Returns(xmlString);
它看起来像一个语法糖,使用 Freeze 方法是一种在流畅的界面中编写模拟创建、配置和自动修复容器注入(inject)的方法。
在网络上做了一些研究后,Freeze 和 Inject 之间实际上存在功能差异。我发现了这个问题: https://github.com/AutoFixture/AutoFixture/issues/59哪一点的答案 How can I Freeze a null instance in AutoFixture
上面链接的作者描述卡住方法如下:
Internally, Freeze creates an instance of the requested type (e.g. IPayPalConfiguration) and then injects it so it will always return that instance when you request it again
我明白当我们这样做的时候
var customer = fixture.Freeze<Order>();
每当我们的代码请求 Order 类型时,它将始终使用相同的 Order 实例。但是,如果我在 Freeze 构造函数中指定我希望它使用特定实例怎么办?
这是一个小代码示例:
[Fact]
public void MethodeName()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
fixture.Freeze<OrderLine>(new OrderLine("Foo"));
var order = fixture.Create<Order>();
}
public class Order
{
private readonly OrderLine _line;
public Order(OrderLine line)
{
_line = line;
}
}
public class OrderLine
{
private readonly string _name;
public OrderLine(string name)
{
_name = name;
}
}
OrderLine 的名称不应该等于“Foo”而不是 namefe48163a-d5a0-49a5-b349-7b11ba5f804b 吗?卡住方法的文档说:
<typeparam name="T">The type to freeze.</typeparam>
<param name="fixture">The fixture.</param>
<param name="seed">Any data that adds additional information when creating the anonymous object. Hypothetically, this value might be the value being frozen, but this is not likely.</param>
为什么作者不确定返回值的时间?如果我在 Freeze 的构造函数中指定我的实例,我希望 autofixture 使用这个实例?
然后
Please notice that the isn't likely to be used as the frozen value, unless you've customized to do this. If you wish to inject a specific value into the Fixture, you should use the method instead.`
看来我必须自定义种子参数。谁能澄清一下?文档指出的解决方案是使用 Inject 方法。事实上,它在我的 OrderLine 代码示例中有效。
我正在寻求您的帮助,以了解 Freeze、Inject 和 Register 之间的区别,根据源代码,后者仅由 Inject 方法调用,但它需要一个 lambda。
最佳答案
注册和注入(inject)
曾几何时,没有Inject
没有 Freeze
; Register
控制代码。
那时候,有一个Register
重载定义如下:
public static void Register<T>(this IFixture fixture, T item)
但是,它必须与这个近亲共享 API:
public static void Register<T>(this IFixture fixture, Func<T> creator)
AutoFixture 的创建者认为这很好,但遗憾的是:用户感到困惑。最糟糕的是,用户可以写:
fixture.Register(() => universe.LightUp());
还有
fixture.Register(universe.LightUp);
意思完全一样,因为universe.LightUp
是对方法的引用,因此与委托(delegate)匹配。
但是,该语法看起来像一个属性引用,所以如果 LightUp
如果是属性而不是方法,编译器将选择第一个重载。
这引起了很多困惑,所以 Register<T>(this IFixture fixture, T item)
重载重命名为 Inject<T>(this IFixture fixture, T item)
.
卡住
卡住有不同的历史。很久以前,当我还在以命令式的方式使用AutoFixture时,我注意到我反复写这样的代码:
var foo = fixture.Create<Foo>();
fixture.Inject(foo);
所以我决定这是一个概念,并将其命名为卡住。 Freeze
method 只是这两行代码的简写。
I'm looking for your help to understand the difference between Freeze, Inject, and also Register which, according to the source code, is just called by Inject method but it takes a lambda
一般来说,区分Inject
应该不难。和 Register
,因为他们的签名不会冲突。因此,如果您尝试使用这两种方法中的一种来实现目标,并且您的代码可以编译,那么您可能选择了正确的版本。
对于 Freeze
也是如此如果不是因为 OP 中使用的过载:
[EditorBrowsable(EditorBrowsableState.Never)]
public static T Freeze<T>(this IFixture fixture, T seed)
注意这个重载实际上有 EditorBrowsableState.Never
,因为它总是让人们感到困惑。然而,尽管如此,显然人们仍然发现过载,所以我认为 it should be moved in AutoFixture 4 .它是存在的功能之一,因为它易于实现...
关于c# - 无法掌握 Freeze/Inject/Register 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18161127/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!