我正在尝试使用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方法时,为什么它不能提前工作。
回过头来看,因为这个方法设置为返回一个特定的值,所以传递给它的内容并不重要,但是知道它会很好。
答案 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;
}
}