- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的测试要求我设置 Response
不可变属性 Rsvp
对象(见下文)为特定值。
public class Rsvp
{
public string Response { get; private set; }
public Rsvp(string response)
{
Response = response;
}
}
我最初尝试使用 Build<Rsvp>().With(x => x.Rsvp, "Attending")
来做到这一点, 但意识到这只支持可写属性。
我将其替换为 Build<Rsvp>().FromFactory(new Rsvp("Attending"))
.这可行,但对于更复杂的对象来说很麻烦,因为某些属性是什么并不重要。
例如,如果 Rsvp
对象有一个 CreatedDate
属性,这种实例化对象的方法会迫使我写 Build<Rsvp>().FromFactory(new Rsvp("Attending", fixture.Create<DateTime>()))
.
有没有办法只为不可变对象(immutable对象)的含义属性指定值?
最佳答案
AutoFixture 最初是作为测试驱动开发 (TDD) 的工具构建的,而 TDD 就是关于反馈的。本着GOOS的精神,您应该听您的测试。如果测试很难编写,您应该考虑您的 API 设计。 AutoFixture 倾向于放大这种反馈。
坦率地说,不可变类型是 C# 中的一个难题,但您可以更轻松地使用 Rsvp
这样的类如果您从 F# 中得到启发并引入复制和更新 语义。如果修改Rsvp
像这样,整体工作会更容易,因此,作为副产品,单元测试也会更容易:
public class Rsvp
{
public string Response { get; private set; }
public DateTime CreatedDate { get; private set; }
public Rsvp(string response, DateTime createdDate)
{
Response = response;
CreatedDate = createdDate;
}
public Rsvp WithResponse(string newResponse)
{
return new Rsvp(newResponse, this.CreatedDate);
}
public Rsvp WithCreatedDate(DateTime newCreatedDate)
{
return new Rsvp(this.Response, newCreatedDate);
}
}
请注意,我添加了两个 WithXyz
方法,返回一个新实例,其中一个值已更改,但所有其他值保持不变。
这将使您能够创建 Rsvp
的实例用于这样的测试目的:
var fixture = new Fixture();
var seed = fixture.Create<Rsvp>();
var sut = seed.WithResponse("Attending");
或者,作为单行:
var sut = new Fixture().Create<Rsvp>().WithResponse("Attending");
如果你不能改变Rsvp
, 您可以添加 WithXyz
方法作为扩展方法。
一旦你这样做了十几次,你就会厌倦它,是时候转移到 F# 了,所有这些(以及更多)都是内置的:
type Rsvp = {
Response : string
CreatedDate : DateTime }
您可以创建一个 Rsvp
像这样用 AutoFixture 记录:
let fixture = Fixture()
let seed = fixture.Create<Rsvp>()
let sut = { seed with Response = "Attending" }
或者,作为单行:
let sut = { Fixture().Create<Rsvp>() with Response = "Attending" }
关于c# - 使用 AutoFixture 实例化 [immutable] 对象时指定 [readonly] 属性值 [via ctor args],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20808755/
我似乎遇到过一个例子,其中默认的移动构造函数似乎根据情况被视为用户声明的和非用户声明的: struct Foo { int a; Foo():a(42){}; //Foo(co
我在我的代码中定义了一个复制构造函数,它正在初始化正在创建的对象的数据成员。现在,如果我只需要更改几个变量的值,我正在编写一个新的复制构造函数。所以我的问题是,我是否可以只初始化特定的不同数据成员,而
为什么从 bar 返回时调用复制构造函数而不是移动构造函数? #include using namespace std; class Alpha { public: Alpha() { cout
我很抱歉这个晦涩的标题,不知道如何更好地表达它。 考虑以下继承层次结构: struct A { A(int) {} }; struct B : virtual A { B() : A(
为什么 var b = new B() 首先进入 static B() .ctor 而不是 static A () .ctor 而不是像实例构造函数那样反之亦然 (public A() 而不是 pub
我正在使用 SourceryGpp lite for arm 开发一个应用程序和一个库。 我没有使用标准库或默认启动文件。因此,要调用我正在对以下代码执行的全局 ctrs: ldr r0,=__cto
class Foo { public: Foo() { Foo(1)} Foo(int x, int y = 0):i(x) {} private: int i; } 任何人都可以给我
在下面的代码中,我想移动构造一个没有可用移动构造函数的对象: class SomeClass{ public: SomeClass() = default; SomeClass(con
这在 C++11 中似乎不起作用: class B : public A { public: B(const A& a) : A(a) // parent constr
我们如何在 F# 中为不可变结构定义一个仅接受部分字段的构造函数。或者,与 C# 相比,我们如何在 f# 中将结构清零(例如在下面的 c# 示例中调用 this())? c# struct Point
代码 #include using namespace std; #define PF cout class derp { public: derp() = default
我所拥有的基本上是一个 std::map,其中包含指向 Views 的指针。 std::map myViews; template bool addView( string assocName ,
我有下面的代码来测试std::string类的copy ctor和move ctor,结果让我吃惊,move ctor慢了~1.4倍比抄袭者。 据我了解, move 构造不需要分配内存,对于std::
我有一个静态构造器,它从我的配置服务器获取配置并设置一个静态变量。 我有一个常规构造函数,它根据该配置实例化一些属性。 这是我类(class)的一个例子: public class MyClass {
这个问题已经有答案了: How do I call New-Object for a constructor which takes a single array parameter? (2 个回答)
我有一个小问题,我不确定这是一个编译器错误,还是我这边的愚蠢。我有这个结构: struct BulletFXData { int time_next_fx_counter; int next_fx
如果我有一个同时定义了复制构造函数和移动构造函数的类,我是否需要使复制构造函数的参数const? 最佳答案 如果copy ctor取的不是const引用参数而是引用参数,那么你将无法copy构造con
我想知道是否有一种安全编程实践可以在这种微妙的行为发生时提醒编码人员,或者更好的是,首先避免这种行为。 struct A 的用户可能没有意识到没有 move 构造函数。在他们尝试调用不存在的 ctor
当类具有普通构造函数和/或普通析构函数时,C++ 标准定义了一些非常具体的行为。 例如,根据标准的 §3.8/1: The lifetime of an object of type T ends w
如果我想禁止复制构造/赋值那么是: class foo { public: foo(const foo&) = delete; foo& operator = (const foo&) =
我是一名优秀的程序员,十分优秀!