关于在接口中寻找泛型的单元测试的思考

Reflections on a unit test looking for generics in an interface

我想编写一些单元测试以确保我的域名称空间和我的 IUnitOfWork 界面正确同步。

例如,如果我有一个 Foo 的域实体,我的 IUnitOfWork 接口中应该有一个对应的 属性 类型的 IQueryable。所以如果我有:

namespace My.Domain 
{
    public class Foo : IEntity<Guid>
    {
        //properties
    }
}

namespace My.Interfaces
{
    public interface IUnitOfWork
    {
        public IQueryable<Foo> Foos { get; }
    }
}

我是这样开始单元测试的:

private static readonly Assembly _assembly = typeof(Assembly.Class).Assembly;

[TestMethod]
public void AllEntitiesInNamespaceHaveCorrespondingIUnitOfWorkProperties()
{
    var classesInDomainNamespace = _assembly.GetTypes()
        .Where(x => string.Equals(x.Namespace, "My.Domain", StringComparison.Ordinal))
        .Distinct();

    var entitiesInUnitOfWork = typeof(IUnitOfWork).GetProperties()
        .Where(x => x.PropertyType.IsAssignableFrom(typeof(IQueryable<IEntity<Guid>>)))
        .Distinct();
}

...这就是我开始 运行 遇到问题的地方。理想情况下,我想断言 classesInDomainNamespaceentitiesInUnitOfWork 中的记录数相同,但是在处理泛型时事情变得很奇怪。

我将如何编写这个单元测试?

这有帮助吗?:

var entitiesInUnitOfWork = typeof(IUnitOfWork).GetProperties()
    .Where(x => 
        x.PropertyType.IsGenericType && 
        x.PropertyType.GetGenericTypeDefinition() == typeof(IQueryable<>) &&  
        typeof(IEntity<Guid>).IsAssignableFrom(x.PropertyType.GetGenericArguments()[0])
    .Distinct();

这不是testet。甚至没有编译 - 但我希望它能给出正确的提示。