Moq单元测试设置不起作用

时间:2013-06-02 06:13:14

标签: nunit ninject moq

我正在尝试使用Ninject Moq框架创建一个简单的单元测试,由于某种原因我无法让Setup方法正常工作。根据我的理解,下面的Setup方法应该将存储库注入到Service类中,其预定义结果为true。

 [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 =&gt; repository.SaveOrUpdate(.profile中)

已配置的设置: x =&gt; x.SaveOrUpdate(.profile),Times.Never

执行调用: IRepository`1.SaveOrUpdate(DynamicCms.Data.DataModels.Profile)

以下是ProfileService类中的CreateProfile方法:

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

编辑:我替换了传递给

的个人资料对象
_profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true); 

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

此方法现在可以正常工作,但是当我将同一个对象传递给Verify和Setup方法时,为什么它不能提前工作。

回过头来看,因为这个方法设置为返回一个特定的值,所以传递给它的内容并不重要,但是知道它会很好。

1 个答案:

答案 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;
    }
 }