2013年12月31日 星期二

UnitTest with private method

VS2010,我們可以使用Test Reference的方法來對private method做單元測試,但在VS2012以後取消了這個架構,以下是測試private method的辦法。

1.  使用PrivateObject

using (CountyRepository repository = new CountyRepository())
{

   PrivateObject accessor = new PrivateObject(repository);
    expected = 1;
   
var returnVal = accessor.Invoke("initialRequestMsg");  // initialRequestMsg
是我們要測試的method name
    actual = (returnVal
as MsgRequestCounty).Data.Count;
   
Assert.AreEqual(expected, actual);
}

=>
注意Invoke的時候可以帶入該method需要的參數

2.  private method改為internal method 並使用[InternalsVisibleTo]屬性

A.   internal method

internal int MyPrivateMethod()
return 1;  }

B.   加入[InternalsVisibleTo] 屬性到該Methodnamespace

using System.Runtime.CompilerServices;
[
assembly: InternalsVisibleTo("Icash.StoreManage.Service.Client.Test")]
namespace Icash.StoreManage.Service.Client

=> InternalsVisibleTo
必須帶入UnitTest projectnamespace


C.   設定完成後,即可在UnitTest呼叫這個internal method



WebApi Post with complex object

WebApi Post with complex object

這次的專案,WebApiPost action使用到較為複雜的物件,結果後來發現不管是物件本身,或是包含關聯的子物件都不能定義成interface,否則不管是request/response,資料都會是空值。

1.  Post action :

[HttpPost]
public MsgResponseCounty Post(MsgRequestCounty reqMsg)

2.  Request 物件定義,注意原本Header這個property是使用一個interface,會造成WebApi收到空值的情況。
public class MsgRequestDo : IDisposable
{
   //public IStoreManageHeader Header { get; set; } //Cannot use interface in WebApi !
   
public MsgStoreManageHeader Header { get; set; }
   
public List<MsgRequestDoData> Data { get; set; }
}

3.  另外也提到在WebApi action如何使用 [FromUri] 去使用Complex object

4.  Reference


2013年12月29日 星期日

2013目標檢視

2013即將結束,今年也是很忙碌的一年,當然有一部分原因是家裡多了一個小成員(╯з╰)
趁機檢視一下年初時除了工作的KPI, 自己訂立的額外目標,是否已經完成了呢?

1. 導入Microsoft ALM solution:
     這部份是小弟最有成就感的部份,目前團隊已經習慣從TFS+Visual studio以及其他三方套件的開發方式,我也更能掌握專案的進度。

2. Infra layer建立:
    下半年花了很多時間在整理整個team程式的架構和重構,新的專案也開始套用,雖然需要學習成本,但對於整體專案開發和維護是一定有幫助的。

3. 自我學習:
     今年公司沒有補助上課費用,我自己花了超過一個月薪水上了一些專案管理、twMVC和微軟的課程,今年終於把MVC架構學起來了! 但是一些RFP文件的課程沒時間和預算去上課,是比較可惜的地方。

4. 還清車貸:
    嗯,一張薄薄的清償證明,和退伍令一樣有鬆了一口氣的感覺。

5. 持續寫blog:
     寫blog 已經變成習慣囉~但是下半年忙專案和小孩,今年目標100篇還沒完成。(目前92/100)

2014的目標,已經有想法了!Just do it!

2013年12月25日 星期三

在Visaul Studio使用Nuget Package

Visaul Studio使用Nuget Package ExplorerPackage

下載  NuGet Package Explorer 

1.  NPE建立好nupkg檔後,開啟Visual Studio,打開【工具】【選項】【套件來源】

 2.  新增一個可用套件來源,名稱自訂,來源請選擇方才放置nupkg檔的路徑。


3.  完成套件來源的設定後,開啟【工具】【程式庫套件管理員】【管理方案的Nuget套件..
可以看到方才我們新增套件來源資料夾下的所有package,可以直接進行安裝。
未來如果有更新的nupkg,可直接到【更新】做upgrade





   未來如果nupkg更新,記得要更新一下version

 

若是單一個專案需要加入nupkg的參考,也可在專案的參考上點選右鍵,選擇管理Nuget套件】 來針對此專案進行加入參考。


[C#] Map Generic type with Unity

1.  Interface

interface
IRepository<R,P>

2.  Class

public
class ConcreteRepository<R, P> : IRepository<R, P>
        where R : A
        where P : B

3.  主程式
//
注入容器
//
注入泛型方式:container.RegisterType(typeof(IRepository<>), typeof(Repository<>))
container.RegisterType(typeof(IRepository<A,B >), typeof(ConcreteRepository <A, B>));

//取得容器的组件
IRepository <A, B> reponsitory = container.Resolve<IRepository<A, B>>();

4.  Reference

2013年12月16日 星期一

[Entity Framework] 使用預存程序更新資料


1.  建立一個如下的表格
CREATE
TABLE [dbo].[JB_USER_D](
       [USER_ID] [varchar](10) NOT NULL,
      
 [USER_PWD] [varchar](10) NULL,         
       CONSTRAINT [JB_USER_D_I01] PRIMARY KEY CLUSTERED ([USER_ID])
      )


2.  新增資料
INSERT INTO JB_USER_D VALUES('XMAN','1234')

3.  新增一個Store procedure
CREATE PROCEDURE [dbo].[SP_Update]
 (
      
@USER_ID        varchar(10),
      
@USER_PWD  varchar(10)
)
AS
UPDATE JB_USER_D
SET USER_PWD=@USER_PWD
WHERE USER_ID=@USER_ID
RETURN
GO

4.  Visual Studio 加入一個實體資料模型






5.  在實體資料模型加入剛才建立的表格以及預存函式






6.  Entity framework 5以上的版本,設定好以上後,EF便會自動幫我們建立一個使用這個SPfunction
開啟[模型名稱].Context.cs就會看到這個函式,可以直接用了。



7.  也可以使用「函式匯入」的方式建立fuction
1.1  在資料模型中 空白處右鍵 「加入新項目」「函式匯入」



1.2  設定我們的函式名稱在「函式匯入名稱」,SP選擇方才匯入的SP_Update



1.3  設定完成,可以在模型瀏覽器看到「函式匯入」的部分多了一個MyUpdate,原本的SP_Update就可以刪除了。




1.4  可以回去[模型名稱].Context.cs看一下改變。

8.  主程式:
MyEntities entity = new MyEntities();
string Id = "Xman";
string newPwd = "888888";
entity.MyUpdate(sUpt_USER_ID, sNew_USER_PWD);



9.  執行程式後,可以看到SP確實被執行了~ 資料表裡的密碼被更新了。