从其他项目调用时,模拟方法返回null

时间:2019-11-20 00:47:42

标签: c# unit-testing nunit nsubstitute

我有这个测试班:

using NSubstitute;
using NUnit.Framework;
using System;
using System.Linq.Expressions;

namespace MyTests
{    
    public class Tests
    {
        [Test]
        public void Test()
        {
            var companyBL = Substitute.For<ICompanyBL>();

            companyBL.GetCompany(c => new { c.RegionID }).ReturnsForAnyArgs(new
            {
                RegionID = 4,
            });

            var company = companyBL.GetCompany(c => new { c.RegionID });

            var dataRetriever = new DataRetriever(companyBL);
        }
    }
}

,此代码在另一个项目中:

namespace MyTests
{
    using System;
    using System.Linq.Expressions;

    public interface ICompanyBL
    {
        T GetCompany<T>(Expression<Func<Company, T>> selector);
    }

    public partial class Company
    {
        public int RegionID { get; set; }
    }

    public class DataRetriever
    {
        public DataRetriever(ICompanyBL companyBL)
        {
            //This is null:
            var company = companyBL.GetCompany(c => new
            {
                c.RegionID
            });
        }
    }
}

company变量为null。 但是,当代码全部包含在同一项目的同一.cs文件中时,该值不是null

为什么在另一个项目的另一个文件中使用值null

NSubstitute版本= 1.10.0.0。

.NET Framework版本= 4.5.2。

在Github中提交的问题: https://github.com/nsubstitute/NSubstitute/issues/598

1 个答案:

答案 0 :(得分:2)

我不确定nsubstitute的工作方式,但我相信您会遇到这样的问题,即匿名类型仅在单个程序集中匹配,而它们在程序集之间总是不同的。

大致上,您在嘲笑companyBL.GetCompany<TestAssembly.AnonymousTypeForRegionID>,并且经过测试的代码调用了companyBL.GetCompany<ProductAssembly.AnonymousTypeForRegionID>

最简单的修复-使用某种类型来传递这两个程序集之间共享的数据。甚至Tuple都可以。 Return/consume dynamic anonymous type across assembly boundaries

中的更多提示
相关问题