c# – AutoFixture使用内部setter创建属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – AutoFixture使用内部setter创建属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2150字,纯文字阅读大概需要4分钟。
内容图文
是否有某种方法让AutoFixture使用内部setter创建属性?
我查看了AutoFixture源代码,发现在AutoPropertiesCommand中,GetProperties方法检查属性是否具有GetSetMethod()!= null.
除非将ignorePublic参数设置为true,否则使用内部setter将返回null.
最简单的事情就是让公共场所公开,但在我正在研究的项目中,这不是正确的解决方案.
以下是项目中一段简化的代码示例.
public class Dummy
{
public int Id { get; set; }
public string Name { get; internal set; }
}
public class TestClass
{
[Fact]
public void Test()
{
var dummy = new Fixture().Create<Dummy>();
Assert.NotNull(dummy.Name);
}
}
解决方法:
理想情况下,测试不应该与类的内部成员交互,因为它们明确地从其公共API中排除.相反,这些成员将通过公共API启动的代码路径间接测试.
但是,如果在您的特定情况下这不可行,则可能的解决方法是从测试中明确地为内部属性赋值.
您可以通过以下两种方式之一来实现:
>使用InternalsVisibleTo属性将程序集中的所有内部成员公开给测试项目.
>通过在特定接口中表示类的可修改状态并明确实现它.
在您的示例中,选项1将是:
// [assembly:InternalsVisibleTo("Tests")]
// is applied to the assembly that contains the 'Dummy' type
[Fact]
public void Test()
{
var fixture = new Fixture();
var dummy = fixture.Create<Dummy>();
dummy.Name = fixture.Create<string>();
// ...
}
相反,选项2将类似于:
public class Dummy : IModifiableDummy
{
public string Name { get; private set; }
public void IModifiableDummy.SetName(string value)
{
this.Name = value;
}
}
[Fact]
public void Test()
{
var fixture = new Fixture();
var dummy = fixture.Create<Dummy>();
((IModifiableDummy)dummy).SetName(fixture.Create<string>());
// ...
}
选项1的实现起来相当快,但是副作用是打开程序集中的所有内部成员,这可能不是您想要的.
另一方面,选项2允许您控制对象状态的哪些部分应该被公开为可修改,同时仍然将它与对象自己的公共API分开.
作为旁注,我想指出,因为你正在使用xUnit,你可以利用AutoFixture的support for Data Theories来让你的测试更加简洁:
[Theory, AutoData]
public void Test(Dummy dummy, string name)
{
((IModifiableDummy)dummy).SetName(name);
// ...
}
如果您希望将Name属性设置为已知值,同时仍然保持Dummy对象的其余部分是匿名的,那么您也可以在同一数据理论中使用combine the two:
[Theory, InlineAutoData("SomeName")]
public void Test(string name, Dummy dummy)
{
((IModifiableDummy)dummy).SetName(name);
// ...
}
内容总结
以上是互联网集市为您收集整理的c# – AutoFixture使用内部setter创建属性全部内容,希望文章能够帮你解决c# – AutoFixture使用内部setter创建属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。