2013-06-02 58 views
0

我想创建一个简单的单元测试,使用Ninject Moq框架,出于某种原因,我无法使安装程序方法正常工作。根据我的理解,下面的Setup方法应该使用预定义的结果true将资源库注入到Service类中。Moq单元测试设置不工作

[TestFixture] 
public class ProfileService : ServiceTest 
{ 
    private readonly Mock<IRepository<Profile>> _profileRepoMock; 

    public ProfileService() 
    { 
     MockingKernel.Bind<IProfileService>().To<Data.Services.Profiles.ProfileService>(); 
     _profileRepoMock = MockingKernel.GetMock<IRepository<Profile>>(); 
    } 


    [Test] 
    public void CreateProfile() 
    { 
     var profile = new Profile() 
      { 
       Domain = "www.tog.us.com", 
       ProfileName = "Tog", 
      }; 

     _profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true); 
     var profileService = MockingKernel.Get<IProfileService>(); 
     bool verify = profileService.CreateProfile(Profile); 

     _profileRepoMock.Verify(repository => repository.SaveOrUpdate(profile), Times.AtLeastOnce()); 

     Assert.AreEqual(true, verify); 
    } 
} 

当我尝试验证它,我得到这个错误:

上模拟

预计调用至少一次,但从未进行:仓库=> repository.SaveOrUpdate(.profile文件)

配置设置: X => x.SaveOrUpdate(.profile中),Times.Never

演出调用: IRepository`1.SaveOrUpdate(DynamicCms.Data.DataModels.Profile)

这里是CreateProfile法在ProfileService类:

public class ProfileService : IProfileService 
    { 
     private readonly IRepository<Profile> _profileRepo; 

     public ProfileService(IRepository<Profile> profileRepo) 
     { 
      _profileRepo = profileRepo; 
     } 
      public bool CreateProfile(ProfileViewModel profile) 
     { 
      Profile profileToCreate = new Profile 
       { 
        Domain = profile.Domain, 
        ProfileName = profile.Name 
       }; 

      bool verify = _profileRepo.SaveOrUpdate(profileToCreate); 

      if (verify) 
      { 
       return true; 
      } 

      return false; 
     } 
} 

编辑:我取代了Profile对象被传递到

_profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true); 

_profileRepoMock.Setup(x => x.SaveOrUpdate(It.IsAny<Profile>())).Returns(true); 

此方法效果现在,但为什么当我通过同一个对象时它不能工作并入验证和设置方法。

回过头来看,由于此方法设置为返回特定值,因此传递给它的内容并不重要,但知道它会很高兴。

+1

你可以发布修改你的' ProfileService.CreateProfile'方法? – nemesv

+0

所有设置,我刚刚添加了该方法。 –

回答

0

你并不需要使用NInject的单元测试此:

[TestFixture] 
public class ProfileServiceTest : ServiceTest 
{ 
    private readonly Mock<IRepository<Profile>> _profileRepoMock; 
} 
[SetUp] 
public void Setup() 
{ 
    _profileRepoMock = new Mock<IRepository<Profile>>(); 
} 

[Test] 
public void CreateProfile() 
{ 
    var profile = new Profile() 
     { 
      Domain = "www.tog.us.com", 
      ProfileName = "Tog", 
     }; 

    _profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true); 
    var profileService = new ProfileService(_profileRepoMock.Object); 
    bool verify = profileService.CreateProfile(Profile); 

    _profileRepoMock.Verify(repository => repository.SaveOrUpdate(profile), Times.AtLeastOnce()); 

    Assert.AreEqual(true, verify); 
} 

}

编辑:这个类必须稍加

public class ProfileService : IProfileService 
{ 
    private readonly IRepository<Profile> _profileRepo; 

    public ProfileService(IRepository<Profile> profileRepo) 
    { 
     _profileRepo = profileRepo; 
    } 
     public bool CreateProfile(ProfileViewModel profile) 
    { 

     bool verify = _profileRepo.SaveOrUpdate(profile); 

     if (verify) 
     { 
      return true; 
     } 

     return false; 
    } 
} 
+0

感谢您的建议,但实际上我仍然使用此方法获取与上述相同的错误消息。 –

+0

这是因为传递给CreateProfile的配置文件对象与传递给SaveOrUpdate的配置文件对象不同。它们都属于同一类型,所以使用It.IsAny当然会起作用。我已更新我的回复以反映适当的解决方案。 – rivarolle