首页 > 解决方案 > 从不同项目调用时返回 null 的模拟方法

问题描述

我有这个测试课:

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
            });
        }
    }
}

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

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

NSubstitute 版本 = 1.10.0.0。

.NET 框架版本 = 4.5.2。

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

标签: c#unit-testingnunitnsubstitute

解决方案


我不确定 nsubstitute 是如何工作的,但我相信您遇到了匿名类型仅在单个程序集中匹配的问题,它们在程序集中总是不同的。

大致上你是在嘲笑companyBL.GetCompany<TestAssembly.AnonymousTypeForRegionID>和你测试过的代码调用companyBL.GetCompany<ProductAssembly.AnonymousTypeForRegionID>

最简单的解决方法 - 使用某种类型来传递这两个程序集之间共享的数据。甚至Tuple会做。跨程序集边界返回/使用动态匿名类型中的更多想法


推荐阅读