c# - 如何将 AutoFixture 与 NSubstitute 结合使用的示例

标签 c# .net autofixture nsubstitute

我经常使用 NSubstitute。我喜欢它。

我只是在研究 AutoFixture。看起来不错!

我看过AutoFixture for NSubstitute并在 Moq 中看到了一些关于如何使用此功能的示例。

但我似乎无法将其翻译成 NSubstitute。

我试过这个:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());  
var addDest = Substitute.For<IPerson>();

使用:

public interface IPersonEntity
{    
   int ID { get; set; }
   string FirstName { get; set;}
   string LastName { get; set;}
   DateTime DateOfBirth { get; set; }
   char Gender { get; set; }    
}

我得到一个对象,但没有填充任何属性(类似于 AutoFixture 的要点)。

我也试过:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());
var result = fixture.Create<IPersonEntity>();

这也给了我一个没有填充属性的对象。 (请注意,如果我使用 PersonEntity 类执行上述操作,那么所有属性都会被填充。)

我确信有办法使这项工作有效,但我似乎找不到。

那么,鉴于我上面的 IPersonEntity 接口(interface),有谁知道如何使用 AutoFixture 和 NSubstitute 给我一个填充的 IPersonEntity 对象?

最佳答案

除了使用 AutoNSubstituteCustomization 自定义 Fixture 实例之外,您还可以使用以下自定义:

var fixture = new Fixture().Customize(
    new AutoPopulatedNSubstitutePropertiesCustomization());

var result = fixture.Create<IPersonEntity>();
// -> All properties should be populated now.

AutoPopulatedNSubstitutePropertiesCustomization 定义为:

internal class AutoPopulatedNSubstitutePropertiesCustomization
    : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.ResidueCollectors.Add(
            new Postprocessor(
                new NSubstituteBuilder(
                    new MethodInvoker(
                        new NSubstituteMethodQuery())),
                new AutoPropertiesCommand(
                    new PropertiesOnlySpecification())));
    }

    private class PropertiesOnlySpecification : IRequestSpecification
    {
        public bool IsSatisfiedBy(object request)
        {
            return request is PropertyInfo;
        }
    }
}

AutoNSubstituteCustomization 的区别在于上面的自定义也是decorated使用 Postprocessor 实例自动为请求类型的所有公共(public)属性设置值。

引用资料:

上述解决方案的灵感来自以下博客文章 Mark Seemann :

关于c# - 如何将 AutoFixture 与 NSubstitute 结合使用的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18342322/

相关文章:

c# - 如何使用 Autofixture 创建和填充模拟类?

unit-testing - 在 AutoFixture 中为被测类创建匿名类型的目的是什么?

c# - 有没有办法用测试数据创建一个类型的实例?

c# - 使用带有 Coldfusion 和 .NET/BouncyCaSTLe 的 Blowfish 加密和解密数据

c# - 当另一个人开始演奏时声音消除

c# - 我可以在 C# 中获取变量或对象的物理地址吗?

c# - 如何识别在 ListBox 中双击了哪个元素?

C# HttpClient 和 Windows 身份验证 : Cannot access a closed Stream

.net - 是否需要将 Visual Studio Express 解决方案转换为 Visual Studio Professional 解决方案?

java - .NET 与 Java 在初创公司中进行 Web 应用程序开发