因此控制器上下文取决于一些asp.net内部.有什么方法可以干净地模拟这些单元测试?当我只需要例如Request.HttpMethod来返回"GET"时,似乎很容易堵塞大量设置的测试.
我在网上看过一些例子/助手,但有些已经过时了.认为这将是保持最新和最伟大的好地方.
我正在使用最新版本的犀牛嘲笑
我想使用带有多参数函数的lambda,但是当我尝试调用该行时,Moq会在运行时抛出此异常mock.Object.Convert(value, null, null, null);.
System.Reflection.TargetParameterCountException: Parameter count mismatch
代码是:
var mock = new Mock<IValueConverter>();
mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(),
It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5);
var value = 5;
var expected = 10;
var actual = mock.Object.Convert(value, null, null, null);
Run Code Online (Sandbox Code Playgroud)
实施它的正确方法是什么?
使用Moq,拥有多个匹配参数是否有效?
It.Is<string>()
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我希望mockMembershipService根据用户提供的内容返回不同的ProviderUserKey.
mockMembershipService.Setup(
x => x.GetUser(
It.Is<string>(
s => s.Contains("Joe")))
.ProviderUserKey)
.Returns("1234abcd");
mockMembershipService.Setup(
x => x.GetUser(
It.Is<string>(
s => s.Contains("Tracy")))
.ProviderUserKey)
.Returns("5678efgh");
Run Code Online (Sandbox Code Playgroud)
SetUp默认为第二个语句,而不是根据它自己的优点来评估每个语句.
我想要做的是为I1构建一个moq - 这很好......但是在我测试的方法过程中使用这个模拟我需要将它转换为I2才能访问一些不在的属性I1
Interface I1
{ int AProperty{get;set;}}
Interface I2
{int AnotherProperty{get;set;}}
Run Code Online (Sandbox Code Playgroud)
然后我有一些对象
Class O1 : I1 {}
Run Code Online (Sandbox Code Playgroud)
和
Class O2 : O1 , I2 {}
Run Code Online (Sandbox Code Playgroud)
问题是,当我有一个I2实现对象的实例时,我可以将它转换为I1,以便访问通过该接口实现的方法.在代码中,这不是问题,并且每个标志都按预期工作.
在该类上编写单元测试时,唯一的问题就出现了.
接口还公开了一个名为GetNewInstance的方法,该方法返回一个初始化的实现对象实例,该实例对象被转换为IGetNewInstance接口...我通常可以模拟这个并使其自行返回(因此我继续使用模拟对象).
但是,当您尝试将此类型I2的返回对象转换为I1时,将引用空引用 - 这是有意义的,因为实现I2的模拟对象不会从继承I1的任何内容继承.
问题是我如何强制模拟对象同时从I1和I2继承?
最近,我开始使用Moq进行单元测试.我使用Moq来模拟我不需要测试的类.
你通常如何处理静态方法?
public void foo(string filePath)
{
File f = StaticClass.GetFile(filePath);
}
Run Code Online (Sandbox Code Playgroud)
怎么可能这个静态方法StaticClass.GetFile()被嘲笑?
PS我很欣赏你推荐的Moq和单元测试的任何阅读材料.
我正在开发一个Web API,我想出的一个测试是,如果客户端使用物理测试ID进行GET操作(物理测试是我正在寻找的资源)并且找不到物理测试,Web API应返回404状态.
现在,我正在使用moq框架进行测试,我有以下代码:
[TestMethod]
public void then_if_physical_test_not_found_return_not_found_status()
{
var unitOfWork = new Mock<IUnitOfWork>();
var repository = new Mock<IRepository<PhysicalTest>>();
repository.Setup(r => r.FindById(It.IsAny<int>())).Returns();
unitOfWork.Setup(m => m.PhysicalTests).Returns(repository.Object);
var pt = new PhysicalTestResource(unitOfWork.Object);
HttpResponseMessage<PhysicalTest> response = pt.GetPhysicalTest(43);
Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode)
}
Run Code Online (Sandbox Code Playgroud)
我需要Returns()方法来返回一个null对象,如果找不到资源,它将是实际API方法返回的对象.
我尝试在Returns()方法中将null作为参数发送但没有成功.
我有一个集成测试,从第三方服务器获取一些json结果.它非常简单,效果很好.
我希望停止实际点击这个服务器并使用Moq(或任何Mocking库,如ninject等)来劫持并强制返回结果.
这可能吗?
以下是一些示例代码: -
public Foo GoGetSomeJsonForMePleaseKThxBai()
{
// prep stuff ...
// Now get json please.
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("Http://some.fancypants.site/api/hiThere);
httpWebRequest.Method = WebRequestMethods.Http.Get;
string responseText;
using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream()))
{
json = streamReader.ReadToEnd().ToLowerInvariant();
}
}
// Check the value of the json... etc..
}
Run Code Online (Sandbox Code Playgroud)
当然,这个方法是从我的测试中调用的.
我在想,也许我需要传递给这个方法(或类的属性?)一个嘲笑httpWebResponse或者什么,但是不太确定这是不是这样.此外,响应是httpWebRequest.GetResponse()方法的输出..所以也许我只需要传入一个模拟HttpWebRequest?
任何带有示例代码的建议都会得到最多的评价!
我想我可能对Moq Callback方法的语法有点困惑.当我尝试做这样的事情时:
IFilter filter = new Filter();
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() };
IQueryable myFilteredFoos = null;
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
.Callback( (IFilter filter) => myFilteredFoos = filter.FilterCollection(objects))
.Returns(myFilteredFoos.Cast<IFooBar>());
Run Code Online (Sandbox Code Playgroud)
这会引发异常,因为myFilteredFoos在Cast<IFooBar>()调用期间为null .这不符合我的预期吗?我认为FilterCollection会被调用,然后myFilteredFoos将是非null并允许演员.
FilterCollection是不是能够返回一个null,它使我得出它没有被调用的结论.另外,当我这样声明时myFilteredFoos:
Queryable myFilteredFoos;
Run Code Online (Sandbox Code Playgroud)
Return调用抱怨myFilteredFoos可以在初始化之前使用.
我有以下方法:
public CustomObect MyMethod()
{
var lUser = GetCurrentUser();
if (lUser.HaveAccess)
{
//One behavior
}
else
{
//Other behavior
}
//return CustomObject
}
Run Code Online (Sandbox Code Playgroud)
我想要模拟IMyInterface.GetCurrentUser,以便在调用时MyMethod我可以访问其中一个代码路径来检查它.如何用Moq做到这一点?
我正在做以下事情:
var moq = new Mock<IMyInterface>();
moq.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);
//act
var lResult = moq.Object.MyMethod();
Run Code Online (Sandbox Code Playgroud)
但由于某些原因lResult总是null,当我试图进入MyMethod调试时,我总是跳到下一个声明.
我正在尝试为调用异步存储库的类创建单元测试.我正在使用ASP.NET Core和Entity Framework Core.我的通用存储库看起来像这样.
public class EntityRepository<TEntity> : IEntityRepository<TEntity> where TEntity : class
{
private readonly SaasDispatcherDbContext _dbContext;
private readonly DbSet<TEntity> _dbSet;
public EntityRepository(SaasDispatcherDbContext dbContext)
{
_dbContext = dbContext;
_dbSet = dbContext.Set<TEntity>();
}
public virtual IQueryable<TEntity> GetAll()
{
return _dbSet;
}
public virtual async Task<TEntity> FindByIdAsync(int id)
{
return await _dbSet.FindAsync(id);
}
public virtual IQueryable<TEntity> FindBy(Expression<Func<TEntity, bool>> predicate)
{
return _dbSet.Where(predicate);
}
public virtual void Add(TEntity entity)
{
_dbSet.Add(entity);
}
public virtual void Delete(TEntity entity)
{
_dbSet.Remove(entity);
}
public virtual …Run Code Online (Sandbox Code Playgroud) moq ×10
unit-testing ×8
c# ×7
mocking ×6
.net ×2
asp.net-core ×1
asp.net-mvc ×1
inheritance ×1
interface ×1
rhino-mocks ×1
wcf-web-api ×1
wpf ×1