Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 asp.net mvc 3 moq n层测试-对象未设置为对象的实例_Asp.net Mvc 3_Unit Testing_Moq_Structuremap - Fatal编程技术网

Asp.net mvc 3 asp.net mvc 3 moq n层测试-对象未设置为对象的实例

Asp.net mvc 3 asp.net mvc 3 moq n层测试-对象未设置为对象的实例,asp.net-mvc-3,unit-testing,moq,structuremap,Asp.net Mvc 3,Unit Testing,Moq,Structuremap,我的以下测试经常失败,我无法找出原因:( [TestClass] 公共类用户测试 { 私有模拟_rmock=new Mock(); 私有模拟_cmock=new Mock(); 私有模拟_umock=新模拟(); 私有Mock_clmock=新Mock(); [测试初始化] 公共作废设置() { 注入(typeof(IRolodexDA),\u rmock.Object); 注入(typeof(ICompanyDA),\u cmock.Object); ObjectFactory.Inject(

我的以下测试经常失败,我无法找出原因:(

[TestClass]
公共类用户测试
{
私有模拟_rmock=new Mock();
私有模拟_cmock=new Mock();
私有模拟_umock=新模拟();
私有Mock_clmock=新Mock();
[测试初始化]
公共作废设置()
{
注入(typeof(IRolodexDA),\u rmock.Object);
注入(typeof(ICompanyDA),\u cmock.Object);
ObjectFactory.Inject(typeof(IUserSettingsDA),mock.Object);
Inject(typeof(ICLObjectContext),clmock.Object);
}
[测试方法]
public void Get\u未启用时返回有效用户
{
字符串email_add=”theguy@totest.com";
列表项=新列表();
添加(新RolodexDomain(){rdx_contact_name=“joe blogs”,rdx_auto_key=1,email_address=email_Add,cv_udf_030=null,sdf_rdx_001=null});
_rmock.Setup(s=>s.Get()).Returns(items.AsQueryable());
var result2=_rmock.Object.Get();
var user=new CLAPortal.Service.UserService();
var result=user.Get(email\u add);
Assert.IsNull(结果);
}
在我的服务层中,我有以下代码:

public class UserService : IUserService
{
    private readonly IRolodexDA _rolodexDA = Resolver.GetConcreteInstanceOf<IRolodexDA>();
    private readonly IUserSettingsDA _userSettingsDA = Resolver.GetConcreteInstanceOf<IUserSettingsDA>();
    private readonly ICompanyDA _companyDA = Resolver.GetConcreteInstanceOf<ICompanyDA>();
    private ICLObjectContext _context = Resolver.GetConcreteInstanceOf<ICLObjectContext>();

    public UserDomain Get(string email_address)
    {
        UserDomain user = null;
        var rdx = GetRolodexForUser(email_address);

        if (rdx != null)
        {
            user = new UserDomain()
            {
                email_address = rdx.email_address,
                name = rdx.rdx_contact_name,
                password = rdx.sdf_rdx_001,
                rdx_auto_key = rdx.rdx_auto_key,
                settings = _userSettingsDA.Get().Where(x => x.rdx_auto_key == rdx.rdx_auto_key).SingleOrDefault() ?? null
            };
        }
        return user;
    }

    private RolodexDomain GetRolodexForUser(string email_address)
    {
        var result = (_rolodexDA.Get().Where(u => u.email_address.ToUpper() == email_address.ToUpper() && u.cv_udf_030.ToUpper() == "T"));

        return result.SingleOrDefault() ?? null;
    }
public类用户服务:IUserService
{
私有只读IRolodexDA_rolodexDA=Resolver.GetConcreteInstanceOf();
私有只读IUserSettingsDA_userSettingsDA=Resolver.GetConcreteInstanceOf();
私有只读ICompanyDA_companyDA=Resolver.GetConcreteInstanceOf();
私有ICLObjectContext_context=Resolver.GetConcreteInstanceOf();
公共用户域Get(字符串电子邮件地址)
{
UserDomain用户=null;
var rdx=GetRolodexForUser(电子邮件地址);
如果(rdx!=null)
{
user=newuserdomain()
{
email\u address=rdx.email\u address,
name=rdx.rdx_联系人_姓名,
密码=rdx.sdf_rdx_001,
rdx_auto_key=rdx.rdx_auto_key,
settings=\u userSettingsDA.Get()。其中(x=>x.rdx\u auto\u key==rdx.rdx\u auto\u key)。SingleOrDefault()??null
};
}
返回用户;
}
私有RolodexDomain GetRolodexForUser(字符串电子邮件地址)
{
var result=(_rolodexDA.Get()。其中(u=>u.email_address.ToUpper()==email_address.ToUpper()&&u.cv_udf_030.ToUpper()==“T”);
返回结果。SingleOrDefault()为空;
}
问题在于调用在服务层上生成GetRolodexForUser。 当我尝试检查值时,它获取未设置为对象实例的对象

现在理论上它应该返回一个空集合

这是我对这个类的测试中唯一一个在重构后失败的测试,但我不知道为什么:(

有什么想法吗? 谢谢


PS这是我第一次尝试分离我的应用程序,并试图使其可测试。因此,我可能在模拟或依赖性注入方面存在一些根本性问题,我不理解。

修复程序在创建模拟获取列表时为cv udf 030传递了一个空字符串,如果为null,则改为null。我非常确定entity framework会将null转换为空弦

public class UserService : IUserService
{
    private readonly IRolodexDA _rolodexDA = Resolver.GetConcreteInstanceOf<IRolodexDA>();
    private readonly IUserSettingsDA _userSettingsDA = Resolver.GetConcreteInstanceOf<IUserSettingsDA>();
    private readonly ICompanyDA _companyDA = Resolver.GetConcreteInstanceOf<ICompanyDA>();
    private ICLObjectContext _context = Resolver.GetConcreteInstanceOf<ICLObjectContext>();

    public UserDomain Get(string email_address)
    {
        UserDomain user = null;
        var rdx = GetRolodexForUser(email_address);

        if (rdx != null)
        {
            user = new UserDomain()
            {
                email_address = rdx.email_address,
                name = rdx.rdx_contact_name,
                password = rdx.sdf_rdx_001,
                rdx_auto_key = rdx.rdx_auto_key,
                settings = _userSettingsDA.Get().Where(x => x.rdx_auto_key == rdx.rdx_auto_key).SingleOrDefault() ?? null
            };
        }
        return user;
    }

    private RolodexDomain GetRolodexForUser(string email_address)
    {
        var result = (_rolodexDA.Get().Where(u => u.email_address.ToUpper() == email_address.ToUpper() && u.cv_udf_030.ToUpper() == "T"));

        return result.SingleOrDefault() ?? null;
    }