我有这个测试班:
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
答案 0 :(得分:2)
我不确定nsubstitute的工作方式,但我相信您会遇到这样的问题,即匿名类型仅在单个程序集中匹配,而它们在程序集之间总是不同的。
大致上,您在嘲笑companyBL.GetCompany<TestAssembly.AnonymousTypeForRegionID>
,并且经过测试的代码调用了companyBL.GetCompany<ProductAssembly.AnonymousTypeForRegionID>
。
最简单的修复-使用某种类型来传递这两个程序集之间共享的数据。甚至Tuple
都可以。 Return/consume dynamic anonymous type across assembly boundaries