Tech/Silverlight2009. 5. 15. 18:41
Rhino Mocks 홈페이지

1. What is Rhino Mocks?
2. 설치
3. Silverlight Unit에서 사용하기
4. Example

1. What is Rhino Mocks?

A dynamic mock object framework for the .Net platform. It's purpose is to ease testing by allowing the developer to create mock implementations of custom objects and verify the interactions using unit testing.

Licensing: Rhino Mocks is Free Software which is released under the BSD license.




2. 설치


Rhino Mocks 3.5 - For Silverlight 

위의 파일을 받아서 압축을 풀어보면 다음과 같은 파일이 들어 있는 것을 확인할 수 있다.


테스트 프로젝트의 참조에 Rhino.Mocks 3.5 Silverlight.dll을 포함시키고 using Rhino.Mocks를 추가하면 된다.




3. Silverlight Unit에서 사용하기


Rhino Mocks를 사용하기 위해서는 다음을 지켜야 한다.

1. Mock Object로 만들 대상 Class의 함수가 상속 가능해야 한다. (virtual)

2. MockRepository에 Mock Object에 대한 선언이 끝나면 ReplayAll을 호출한다.

3. Test가 끝나면 VerifyAll을 호출해 정의한 대로 실행되었는지 확인한다.

 - VerifyAll을 호출하였을 때 정의한 대로 실행되지 않았다면 Test Fail이 발생한다.


Rhino Mocks로 클래스/인터페이스를 Mocking하기 위해서 다음과 같은 절차를 거친다.

1. MockRepository를 만든다.
ex. MockRepository mocks = new MockRepository();

2. 클래스인 경우에 PartialMock, 인터페이스인 경우에 StrickMock을 이용해 MockObject를 만든다.
ex. ContentsPlayerMain cpMain = mocks.PartialMock<ContentsPlayerMain>();

Mock Object에서 가상으로 사용할 함수를 선언한다.

return value가 있을 경우 _ Expect.Call(function)
return value가 void인 경우 _ Expect.Call(delegate{function;}) or ...; LastCall

-

Expect.Call의 Return 결과물에 새로운 Return Value나 함수 호출 횟수를 설정할 수 있다.

Expect.Call(function).Return(data); - function을 호출하면 data가 return 된다.

Expect.Call(function).Repeat.Once() - function이 한 번만 실행되는 것을 확인한다.

-

Mock Object에서 Expect.Call로 정의된 함수를 호출하게 되면 실제 Class의 해당 함수의 동작을 따르는 것이 아니라 정의한 함수의 동작을 따르게 된다.
ex. Expect.Call(cpMain.GetSynchronizeData(15)).Return(data); 
// GetSynchronizeData 함수에 15가 인자로 들어오면 data를 return 한다.

참고 자료) Rhino Mocks 3.3 Quick Reference.pdf




4. Example


- 다음과 같은 함수를 Mock Object를 통해서 테스트 해본다.

internal virtual void Synchronize(double time, bool isSeek)
{
SynchronizeData synchronizeData = GetSynchronizeData(time);
currentSlide = synchronizeData.slideIndex;
currentEvent = synchronizeData.eventIndex;
if (isSeek)
{
GotoAndStop(currentSlide, currentEvent);
}
else
{
GotoAndPlay(currentSlide, currentEvent);
}
}

위 함수에서 사용하는 클래스 멤버 함수인 GetSynchronizeData, GotoAndStop, GotoAndPlay를 Mock Object를 통해 구현하자.

1. TestCase에는 time이 15와 30이 들어온다고 가정하고, 각각의 time에  대한 Data를 미리 준비한다.
2. Mock Object를 이용해 GeySynchronizeData의 인자로 15와 30이 들어왔을 경우에 준비한 Data를 Return.
3. Mock Object를 이용해 GotoAndPlay에 1, 1이 인자로 들어오고, 한 번만 호출되는 것을 확인
4. Mock Object를 이용해 GotoAndStop에 2, 0이 인자로 들어오고, 한 번만 호출되는 것을 확인

[TestMethod]
public void TestMethod()
{
MockRepository mocks = new MockRepository();

ContentsPlayerMain cpMain = mocks.PartialMock<ContentsPlayerMain>();

SynchronizeData data1 = new SynchronizeData();
data1.slideIndex = 1;
data1.eventIndex = 1;
SynchronizeData data2 = new SynchronizeData();
data2.slideIndex = 2;
data2.eventIndex = 0;

Expect.Call(cpMain.GetSynchronizeData(15)).Return(data1);
Expect.Call(cpMain.GetSynchronizeData(30)).Return(data2);
Expect.Call(delegate { cpMain.GotoAndPlay(1, 1); }).Repeat.Once();
Expect.Call(delegate { cpMain.GotoAndStop(2, 0); }).Repeat.Once();

mocks.ReplayAll();

cpMain.Synchronize(15, false);
Assert.AreEqual(1, cpMain.CurrentSlide);
Assert.AreEqual(1, cpMain.CurrentEvent);
cpMain.Synchronize(30, true);
Assert.AreEqual(2, cpMain.CurrentSlide);
Assert.AreEqual(0, cpMain.CurrentEvent);

mocks.VerifyAll();
}


'Tech > Silverlight' 카테고리의 다른 글

ImageButton 만들기  (0) 2009.06.11
Silverlight2 Unit Test  (0) 2009.05.19
DataGrid 사용법  (0) 2009.04.06
LINQ (Language Integrated Query)  (0) 2009.04.06
Posted by 알 수 없는 사용자
Tech/Silverlight2009. 4. 6. 12:00
1. DataGrid 컨트롤은?
2. DataGrid 컨트롤에서 세부 데이타 표시하기



1. DataGrid 컨트롤은?

System.Windows.Controls 네임스페이스에 속해 있는 리스트 스타일의 컨트롤이다.

DataGrid는 UI가상화를 사용하고 있어서, 몇만 개의 데이터의 행을 지원할 있도록 보장해준다.

UI가상화란 사용자에게 보이는 모든 아이템들은 메모리 안에서 생성된다는 것을 의미한다


DataGrid 컨트롤의 실행 샘플.


2. DataGrid에서 컨트롤에서 세부 데이타 표시하기


XAML에서 DataGrid 컨트롤을 사용을 위한 NameSpace 정의.

<UserControl x:Class="DataGridSample.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    >
    <Grid x:Name="LayoutRoot" Background="White">       
        <data:DataGrid x:Name="myDataGrid" />
    </Grid>
</UserControl>


데이타 소스 설정.

myDataGrid.ItemsSource = GetEoticons();
private  List<Emotion> GetEmoticons()
{
       List<Emotion> emoticons = new List<Emotion>();
       emoticons.Add(new Emotion("철수",    "1.jpg"));
       emoticons.Add(new Emotion("영희",    "2.jpg"));
       emoticons.Add(new Emotion("바둑이", "3.jpg"));
       return emoticons;            
 }

public class Emotion
{       
        private BitmapImage icon = null;
        public Emotion(string name, string imageUrl)
        {
            Name = name;
            Icon = new BitmapImage(new Uri(imageUrl, UriKind.Relative));
        }
        public string Name
        {
            get;
            private set;
        }
        public BitmapImage Icon
        {
            get { return icon;  }
            set
            {
                icon = value;
            }
        }
}


세부 데이타 표시하기
- AutoGenerateColumns False로 설정하고, DataGrid.Columns를 사용하여 데이터를 표시할 칼럼 형식을 정의.

- DataGridTextColumn 클래스의 SortMemberPath로  정렬될 멤버 설정하여 아이템 정렬.
- DataGridTemplateColumn 클래스의 CellTemplate으로 사용자 정의(고유한 열 형식) 템프릿 생성.

<data:DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" IsReadOnly="False">
      <data:DataGrid.Columns>
           <data:DataGridTextColumn Binding="{Binding Name, Mode=twoWay}" SortMemberPath="Name"/>
                <data:DataGridTemplateColumn>
                    <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Icon}" Height="100"/>
                        </DataTemplate>
                    </data:DataGridTemplateColumn.CellTemplate>    
           </data:DataGridTemplateColumn>
     </data:DataGrid.Columns>
</data:DataGrid>


DataGrid 편집 하기.
- IsReadOnly를 False로 설정
- Binding Mode를 twoWay로 설정.
- 편집과 관련된 Event. 

BiginningEdit 
- DataGridBeginningEditEventArgs파라미터 안에 Cancel속성을 True 변경하면 편집을 막을 있다.
PrepareCellForEdit 
-
DataGridTemplateColumn 내부의 콘텐트가 편집 모드가 들어갈 발생.
- BeginningEdit 이벤트에서 생성한 변화들을 다시 한번 변경할 있는 기회를 준다.

 

 


 

'Tech > Silverlight' 카테고리의 다른 글

Silverlight2 Unit Test  (0) 2009.05.19
Rhino Mocks in Silverlight  (2) 2009.05.15
LINQ (Language Integrated Query)  (0) 2009.04.06
Silverlight with WEB  (0) 2009.03.30
Posted by 알 수 없는 사용자