如果我从故事板中的标识符中出列单元格,那么在单元测试方式中如何调用cellForRowAtIndexPath而不是单元格为零?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCell];
cell.guestNameText.text = self.details.guestName;
return cell;
}
Run Code Online (Sandbox Code Playgroud)
不工作,在调用dequeReusableCell并且cell为nil之后设置一个断点:
ETA:更新的工作代码以通过测试:
- (void)setUp {
[super setUp];
_detailVC_SUT = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]
instantiateViewControllerWithIdentifier:kDetailsVC];
_myService = [OCMockObject niceMockForClass:[MyService class]];
_detailVC_SUT.service = _myService;
}
- (void)test_queryForDetailsSucceeded_should_set_cell_text_fields {
[_detailVC_SUT view]; // <--- Need to load the view for this to work
Details *details = [DetailsBuilder buildStubDetails];
[_detailVC_SUT queryForDetailsSucceededWithDetails:details];
[self getFirstCellForGuestName];
}
- (void)getFirstCellForGuestName {
MyCustomTableViewCell *guestNameCell = (MyCustomTableViewCell*)[_detailVC_SUT tableView:_detailVC_SUT.detailsTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
expect(guestNameCell.guestNameText.text).to.equal(@"Mark");
}
Run Code Online (Sandbox Code Playgroud) 如果我有一个经理创建和实例变量,我做:
AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRequest:request success:mySuccessBlock failure:myFailureBlock];
[operation start];
Run Code Online (Sandbox Code Playgroud)
这会在经理的operationQueue上运行吗?我似乎无法找到任何保证它将使用GET,POST,PUT方法之一,而我假设将把操作添加到队列.
我在这里看到了mattt的答案,但我想确定这种或那种方式.
我要做的是排队请求并让它们通过设置同步运行
[self.manager.operationQueue setMaxConcurrentOperationCount:1];
Run Code Online (Sandbox Code Playgroud) 我有这个单元测试:
[Test]
public void ProcessDbFile_should_delete_file_if_it_exists_then_copy_new_file_to_same_location()
{
// used to create condition where file already exists
if (!File.Exists(path2))
File.Create(path2);
_dbInstaller.ProcessDbFile(path1);
File.Exists(path2).ShouldBe(true);
errorReceived.ShouldBe(null);
}
Run Code Online (Sandbox Code Playgroud)
当我在ProcessDbFile例程中找到这个部分时发生了什么:
if (File.Exists(path2))
_dbDropper.DropDb();
Run Code Online (Sandbox Code Playgroud)
然后转到这个:
public bool DropDbStub()
{
try
{
File.Delete(@"c:\dbdata\data.mdf");
}
catch
{
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我得到了另一个进程正在使用该文件的异常.
我想我的主要问题是单元测试是一个单独的过程吗?
如果我注释掉单元测试的前两行:
// if(!File.Exists(path2))// File.Create(path2);
我没有得到异常,即使文件已经存在,删除按计划发生,只有当我在单元测试中有前两行时(并且它确实跳转到Create行,不知何故单元测试似乎有锁定文件.我可以做些什么来克服这个问题,保持测试正常工作,如果文件已经存在则测试删除文件,如果文件已经存在则先创建它?
如果您有一个业务规则,如果您将此过滤器放在Repository的GetAll()中,那么用户(或UI)永远不会看到表中的前30个项目?这意味着,存储库是否会处理数据过滤,将数据模型化为像ViewModel或Controller一样交给调用者?我听说模型应该很厚,控制器/ vms应该很轻.
我遇到的问题是另一个与我共享项目的开发人员,他的所有存储库(每个表一个)都使用相同的实现,只需将LinqToSql类型的属性复制到域类型.除了通过提供的Func更新和删除或获取数据之外,存储库本身没有逻辑.
另一方面,我为每个表创建了一个存储库(继承自T的IRepository),并将特定逻辑放在一些(不是全部)我认为需要逻辑来交还域对象的地方.
所以在我的情况下,业务逻辑可以在存储库中完成,在他的情况下,它必须由用户完成,该用户可以是服务或直接是ViewModel.哪个更优选?
我在这里使用Caliburn.Micro bootstrapper:
https://gist.github.com/1127914
如果我将所有视图和视图模型保留在与bootstratpper相同的项目中,则一切正常.
但我想将Views和ViewModels文件夹推送到另一个程序集/项目,我这样做,更改名称空间,更新引导程序以找到该viewmodel.现在,当我跑步时,我得到了错误
"没有找到支持MVVMBook.ViewModules.ViewModels.MainViewModel服务的组件"
在这部分引导程序上:
return string.IsNullOrWhiteSpace(key)
? _container.Resolve(service)
: _container.Resolve(key, service);
Run Code Online (Sandbox Code Playgroud)
显然它无法连接ViewModel,即使VM被设置为Bootstrapper的通用参数:
public class CastleBootstrapper : Bootstrapper<MainViewModel>
Run Code Online (Sandbox Code Playgroud)
我正在使用的命名约定是一个名为Views的文件夹和一个名为ViewModels的文件夹,文件是MainView.xaml和MainViewModel.cs
我在哪里可以告诉它看这个集会?
还将此块添加到引导程序中,因为当视图和视图模型位于单独的程序集中但未解决此问题时,建议使用此块:
// needed if views and viewmodels are in a seperate assembly
protected override IEnumerable<Assembly> SelectAssemblies()
{
return new[]
{
Assembly.GetExecutingAssembly()
};
}
Run Code Online (Sandbox Code Playgroud) 需要使用automapper将域类型的属性从上下文映射回现有实体(基本上只是更新已更改的字段).我需要它来忽略导航属性并只映射标量属性.
如果我说ForMember(o => o.MyNavProperty,opt => opt.Ignore),我可以让它工作但我宁愿为我的所有映射都有一个通用的方法来告诉它只映射标量而不是导航属性.
试图遵循Mauricio的解决方案:
ASP.net MVC - 我应该使用ViewModel中的AutoMapper到Entity Framework实体吗?
但我不能让它成功地忽略我的导航属性.
这是我的更新版本:
private static void CreateMapForEF<TDto, TEntity>()
{
Mapper.CreateMap<TDto, TEntity>()
.ForAllMembers(o => o.Condition(ctx =>
{
var members = ctx.Parent.SourceType.GetMember(ctx.MemberName); // get the MemberInfo that we are mapping
if (!members.Any())
return false;
if (members.First().GetCustomAttributes(
typeof (EdmRelationshipNavigationPropertyAttribute), false).Any())
return false;
return members.First().GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false).Any(); // determine if the Member has the EdmScalar attribute set
}));
}
Run Code Online (Sandbox Code Playgroud) 如果我有一个像这样的ViewModel:
public class ViewModel : IPropertyChangeBase, IViewModel
{
}
Run Code Online (Sandbox Code Playgroud)
我在视图的xaml中设置的"Title"属性,它必须正确显示.
如果我从View继承了ViewModel,那么标题中显示的是ViewModel的完整类型名称,如"MarksProject.ViewModels.ViewModel".这显示在窗口的标题上.
//View Title property being overriden.
public class ViewModel : Screen, IViewModel
{
}
Run Code Online (Sandbox Code Playgroud) 我只是想确认为什么需要它.
我将此代码添加到KIImagePager(一个cocoapod)以加载应用程序本地的图像(默认代码从URL加载图像).
这是我的工作代码基于同事的建议:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
[imageView setImage:[UIImage imageNamed:[aImageUrls objectAtIndex:i]]];;
});
});
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我取出内部dispatch_sync,它可以工作,但不是我想要的方式(当我开始滚动时,图像寻呼机scrollview上的一些图像尚未加载).但他们最终会加载.
我的问题是,主队列上的同步调用是否将图像返回到UI(位于主队列中)?因为它确实与删除的第二个异步一起工作.
这在UIImageView上不使用AFNetworking的类别方法时有效,但我意识到AF可能会覆盖所做的任何事情,因为这发生了异步:
这是在我的自定义UITableViewCell(自己是单元格):
NSURL *url = [NSURL URLWithString:video.thumbnail];
[self.imageView setImageWithURL:url
placeholderImage:[UIImage imageNamed:@"Logo.png"]];
// not working
CALayer *layer = [self.imageView layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:10.0];
Run Code Online (Sandbox Code Playgroud)
尝试在调用setImageWithURL之前放置它.
这就是我现在所拥有的并且它不是圆角:
NSURL *url = [NSURL URLWithString:_video.thumbnail];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
UIImage *placeHolder = [UIImage imageNamed:@"Logo"];
__weak UIImageView *imageView = self.thumbnail;
[self.thumbnail setImageWithURLRequest:request placeholderImage:placeHolder success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
imageView.image = image;
// round the edges of the video thumbnail
CALayer *layer = [imageView layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:8.0];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, …Run Code Online (Sandbox Code Playgroud) c# ×4
ios ×4
objective-c ×3
afnetworking ×2
iphone ×2
mvvm ×2
wpf ×2
automapper ×1
calayer ×1
cocoa-touch ×1
file-io ×1
model ×1
storyboard ×1
unit-testing ×1